Compare commits

...
235 Commits
Author SHA1 Message Date
amadou 10c7576c46 vault backup: 2026-09-16 11:12:22 2026-09-16 11:12:22 -04:00
amadou e3f51ca46f Stop tracking Smart Environment local data 2026-09-15 20:48:25 -04:00
amadou 90bc26f14f vault backup: 2026-09-15 11:11:42 2026-09-15 20:46:28 -04:00
Amadou Ndiaye 2d6440b141 vault backup: 2026-09-15 17:13:50 2026-09-15 17:13:50 -04:00
amadou ab4b4f8c7d vault backup: 2026-09-15 14:53:23 2026-09-15 14:53:23 -04:00
Amadou Ndiaye 44e4e827bb vault backup: 2026-09-15 14:32:20 2026-09-15 14:32:21 -04:00
Amadou Ndiaye 44b9efeb2a vault backup: 2026-09-15 14:11:28 2026-09-15 14:11:28 -04:00
amadou 7345e3c47f vault backup: 2026-09-15 12:02:06 2026-09-15 12:02:06 -04:00
amadou e6c6860244 vault backup: 2026-09-15 11:01:48 2026-09-15 11:01:48 -04:00
amadou f9856ea92b vault backup: 2026-09-15 10:41:43 2026-09-15 10:41:43 -04:00
amadou 91c9bd9730 vault backup: 2026-09-14 22:58:33 2026-09-14 22:58:33 -04:00
amadou 03ed057733 vault backup: 2026-09-14 22:25:26 2026-09-14 22:25:26 -04:00
amadou 7cdfcc07e2 vault backup: 2026-09-14 22:05:22 2026-09-14 22:05:22 -04:00
amadou 94aab8f611 vault backup: 2026-09-12 10:18:55 2026-09-12 10:18:55 -04:00
amadou 6468179654 Ignore generated Smart Connections and weekly review files 2026-09-12 10:10:29 -04:00
amadou c1e1cd8edd vault backup: 2026-09-11 21:35:10 2026-09-11 21:35:11 -04:00
amadou 8a304759ef vault backup: 2026-09-11 20:58:40 2026-09-11 20:58:40 -04:00
amadou edfce9159a vault backup: 2026-09-11 20:38:31 2026-09-11 20:38:31 -04:00
amadou 31c2fc64e7 vault backup: 2026-09-11 20:18:23 2026-09-11 20:18:23 -04:00
amadou 210f6134d1 vault backup: 2026-09-11 16:29:33 2026-09-11 16:29:33 -04:00
amadou 3e33070896 vault backup: 2026-09-11 16:09:25 2026-09-11 16:09:25 -04:00
amadou 48f5f29182 vault backup: 2026-09-11 15:49:16 2026-09-11 15:49:16 -04:00
amadou 55a9be9c4c vault backup: 2026-09-11 13:49:01 2026-09-11 13:49:01 -04:00
amadou 648546b3ee vault backup: 2026-09-11 12:07:54 2026-09-11 12:07:54 -04:00
amadou 9e1278a840 vault backup: 2026-09-11 11:47:51 2026-09-11 11:47:51 -04:00
amadou c58930aace vault backup: 2026-09-11 11:27:44 2026-09-11 11:27:44 -04:00
amadou 1e87c0e572 vault backup: 2026-09-11 11:07:40 2026-09-11 11:07:40 -04:00
amadou 1ea0f3eac2 vault backup: 2026-09-11 10:47:36 2026-09-11 10:47:36 -04:00
amadou 207da48c92 vault backup: 2026-09-11 10:27:33 2026-09-11 10:27:33 -04:00
amadou 9da8061869 vault backup: 2026-09-10 16:16:18 2026-09-10 16:16:18 -04:00
amadou a595c355eb vault backup: 2026-09-10 14:55:50 2026-09-10 14:55:50 -04:00
amadou 70f79b7357 vault backup: 2026-09-10 12:07:03 2026-09-10 12:07:03 -04:00
amadou 14236c3d3b vault backup: 2026-09-10 11:06:52 2026-09-10 11:06:52 -04:00
amadou f647808ee8 vault backup: 2026-09-10 10:46:47 2026-09-10 10:46:47 -04:00
amadou 044c584ff3 vault backup: 2026-09-08 21:04:22 2026-09-08 21:04:22 -04:00
amadou cb36c70bdd vault backup: 2026-09-08 20:44:18 2026-09-08 20:44:18 -04:00
amadou 8aa606806a vault backup: 2026-09-08 20:03:26 2026-09-08 20:03:26 -04:00
amadou 79f051f695 vault backup: 2026-09-08 19:28:21 2026-09-08 19:28:21 -04:00
amadou 18a9c3f70b vault backup: 2026-09-08 14:27:03 2026-09-08 14:27:03 -04:00
amadou 5a253cdf57 vault backup: 2026-09-08 12:46:04 2026-09-08 12:46:04 -04:00
amadou 13ee0820ea vault backup: 2026-09-08 11:05:00 2026-09-08 11:05:01 -04:00
amadou bef7475941 vault backup: 2026-09-08 10:24:56 2026-09-08 10:24:56 -04:00
amadou c4a01cddcb vault backup: 2026-08-27 18:00:32 2026-08-27 18:00:32 -04:00
amadou e579a4836e vault backup: 2026-08-25 04:07:14 2026-08-25 04:07:14 -04:00
amadou 6ac1881947 Last Sync: 2026-08-25 09:29 (Mobile) 2026-08-25 09:29:06 +02:00
amadou e58ca17c07 vault backup: 2026-08-24 16:04:44 2026-08-24 16:04:44 -04:00
amadou 6d511d9c17 vault backup: 2026-08-24 12:57:45 2026-08-24 12:57:45 -04:00
amadou fe4bfdd955 vault backup: 2026-08-23 17:54:04 2026-08-23 17:54:05 -04:00
amadou 116f1772b0 vault backup: 2026-08-23 17:17:39 2026-08-23 17:17:39 -04:00
amadou aa038bb1ff vault backup: 2026-08-23 16:57:37 2026-08-23 16:57:37 -04:00
amadou ef4e063005 vault backup: 2026-08-23 16:37:36 2026-08-23 16:37:36 -04:00
amadou a6421f5cd1 vault backup: 2026-08-21 17:06:22 2026-08-21 17:06:22 -04:00
amadou e26f814e34 vault backup: 2026-08-21 16:06:18 2026-08-21 16:06:18 -04:00
amadou 5e38bfb89a vault backup: 2026-08-21 13:04:14 2026-08-21 13:04:14 -04:00
amadou fb10813707 Merge remote-tracking branch 'origin/main' 2026-08-21 12:44:13 -04:00
amadou 4ed0cb7e0d vault backup: 2026-08-21 12:44:12 2026-08-21 12:44:12 -04:00
amadou 374e9e5919 vault backup: 2026-08-21 18:31:08 2026-08-21 18:31:08 +02:00
amadou 142a778b84 vault backup: 2026-08-21 12:04:08 2026-08-21 12:04:08 -04:00
amadou 1b2ec281db vault backup: 2026-08-21 11:44:06 2026-08-21 11:44:06 -04:00
amadou 4577f285c6 vault backup: 2026-08-21 11:24:01 2026-08-21 11:24:01 -04:00
amadou 28397c2602 Merge remote-tracking branch 'origin/main' 2026-08-21 08:23:37 -04:00
amadou 2f39288102 vault backup: 2026-08-21 08:23:36 2026-08-21 08:23:36 -04:00
amadou 6773adc470 Merge remote-tracking branch 'origin/main' 2026-08-21 14:10:09 +02:00
amadou cf6f8229e3 vault backup: 2026-08-21 14:10:09 2026-08-21 14:10:09 +02:00
amadou 193105482b vault backup: 2026-08-21 08:03:34 2026-08-21 08:03:34 -04:00
amadou d9b93b57f9 vault backup: 2026-08-21 06:05:31 2026-08-21 06:05:31 -04:00
amadou beb765f83f vault backup: 2026-08-21 05:45:29 2026-08-21 05:45:29 -04:00
amadou 8426909587 vault backup: 2026-08-21 03:06:47 2026-08-21 03:06:47 -04:00
amadou e59ad31723 vault backup: 2026-08-20 17:45:42 2026-08-20 17:45:42 -04:00
amadou 4c516ba2e4 vault backup: 2026-08-20 17:25:40 2026-08-20 17:25:40 -04:00
amadou f143d87bef vault backup: 2026-08-20 17:05:38 2026-08-20 17:05:38 -04:00
amadou 8f970a26d8 vault backup: 2026-08-20 16:05:34 2026-08-20 16:05:34 -04:00
amadou 3e17f7fbcb vault backup: 2026-08-20 15:45:32 2026-08-20 15:45:32 -04:00
amadou be40bc2c50 vault backup: 2026-08-20 15:04:33 2026-08-20 15:04:34 -04:00
amadou 2dc3c0f4d9 vault backup: 2026-08-20 14:44:28 2026-08-20 14:44:28 -04:00
amadou b87e7f7ec9 vault backup: 2026-08-20 14:24:26 2026-08-20 14:24:26 -04:00
amadou 265d3bc31b vault backup: 2026-08-20 13:26:09 2026-08-20 13:26:09 -04:00
amadou 8e48532941 vault backup: 2026-08-20 12:19:04 2026-08-20 12:19:04 -04:00
amadou ac686ab3d7 vault backup: 2026-08-20 11:18:46 2026-08-20 11:18:46 -04:00
amadou 770355e097 vault backup: 2026-08-20 10:09:13 2026-08-20 10:09:13 -04:00
amadou bea2bea1c3 vault backup: 2026-08-19 17:55:06 2026-08-19 17:55:06 -04:00
amadou 31f3456223 vault backup: 2026-08-19 17:35:02 2026-08-19 17:35:02 -04:00
amadou c37d1838bb vault backup: 2026-08-19 16:34:54 2026-08-19 16:34:54 -04:00
amadou bbfc760ae1 vault backup: 2026-08-19 12:05:10 2026-08-19 12:05:10 -04:00
amadou 5b6716dd7e vault backup: 2026-08-19 11:45:08 2026-08-19 11:45:08 -04:00
amadou 83fe0a1c5a vault backup: 2026-08-19 11:25:06 2026-08-19 11:25:06 -04:00
amadou 1ffff7727d vault backup: 2026-08-19 11:05:04 2026-08-19 11:05:04 -04:00
amadou adcd726102 vault backup: 2026-08-19 10:45:02 2026-08-19 10:45:02 -04:00
amadou 4aa9c8bbdc vault backup: 2026-08-19 10:25:00 2026-08-19 10:25:00 -04:00
amadou 1e7e176016 vault backup: 2026-08-19 10:04:58 2026-08-19 10:04:58 -04:00
amadou 264271615c vault backup: 2026-08-19 09:44:56 2026-08-19 09:44:56 -04:00
amadou 1b05737f1c vault backup: 2026-08-18 17:19:46 2026-08-18 17:19:46 -04:00
amadou 7f9e004931 vault backup: 2026-08-18 16:59:44 2026-08-18 16:59:44 -04:00
amadou 29f3a60c67 vault backup: 2026-08-18 14:39:36 2026-08-18 14:39:36 -04:00
amadou 2dbe101a25 vault backup: 2026-08-18 14:19:34 2026-08-18 14:19:34 -04:00
amadou a3dd78acb1 vault backup: 2026-08-18 13:19:17 2026-08-18 13:19:17 -04:00
amadou b234134f40 vault backup: 2026-08-18 11:57:50 2026-08-18 11:57:50 -04:00
amadou b51889edf9 vault backup: 2026-08-18 11:37:48 2026-08-18 11:37:48 -04:00
amadou ed9cd20750 vault backup: 2026-08-17 17:46:17 2026-08-17 17:46:17 -04:00
amadou bf6ee4669a vault backup: 2026-08-17 17:26:12 2026-08-17 17:26:12 -04:00
amadou 55730b10e8 vault backup: 2026-08-17 15:05:59 2026-08-17 15:05:59 -04:00
amadou 85a48f9dbd vault backup: 2026-08-17 14:45:57 2026-08-17 14:45:57 -04:00
amadou ca4d0fa4a9 vault backup: 2026-08-17 14:25:16 2026-08-17 14:25:16 -04:00
amadou 761328b643 vault backup: 2026-08-17 14:05:14 2026-08-17 14:05:14 -04:00
amadou f81fbf55a8 vault backup: 2026-08-17 12:38:08 2026-08-17 12:38:08 -04:00
amadou b3573dad40 vault backup: 2026-08-17 10:38:26 2026-08-17 10:38:26 -04:00
amadou b3a21e89c9 vault backup: 2026-08-17 10:18:23 2026-08-17 10:18:23 -04:00
amadou e825f3a8a1 vault backup: 2026-08-16 22:42:38 2026-08-16 22:42:38 +02:00
amadou 27304b72ee vault backup: 2026-08-16 22:22:36 2026-08-16 22:22:36 +02:00
amadou cefb2b18c6 vault backup: 2026-08-16 22:02:34 2026-08-16 22:02:34 +02:00
amadou 72c28bbb68 vault backup: 2026-08-16 10:57:28 2026-08-16 10:57:28 +02:00
amadou 85b516814b Last Sync: 2026-08-16 10:45 (Mobile) 2026-08-16 10:45:23 +02:00
amadou 0fd0f77b58 Last Sync: 2026-08-16 10:42 (Mobile) 2026-08-16 10:42:39 +02:00
amadou 5cb906c2ff Last Sync: 2026-08-16 10:41 (Mobile) 2026-08-16 10:41:57 +02:00
amadou d0e4bc74b6 vault backup: 2026-08-15 03:46:31 2026-08-15 03:46:31 -04:00
amadou 4b2f3de1b9 vault backup: 2026-08-15 03:24:03 2026-08-15 03:24:03 -04:00
amadou 31daaf0abf vault backup: 2026-08-15 03:04:00 2026-08-15 03:04:00 -04:00
amadou 8b66a94558 vault backup: 2026-08-14 17:44:20 2026-08-14 17:44:20 -04:00
amadou 75a7ac1a3e vault backup: 2026-08-14 17:09:04 2026-08-14 17:09:04 -04:00
amadou db8afb22a8 vault backup: 2026-08-14 16:49:02 2026-08-14 16:49:02 -04:00
amadou 4635ea4423 vault backup: 2026-08-14 13:45:18 2026-08-14 13:45:18 -04:00
amadou 58bddec2fe vault backup: 2026-08-14 13:25:15 2026-08-14 13:25:15 -04:00
amadou 9990fa6660 vault backup: 2026-08-14 13:05:08 2026-08-14 13:05:08 -04:00
amadou a9be9deda5 vault backup: 2026-08-13 17:33:40 2026-08-13 17:33:40 -04:00
amadou 3b162dd4f2 vault backup: 2026-08-13 17:13:36 2026-08-13 17:13:36 -04:00
amadou 99a44b9bc4 vault backup: 2026-08-13 16:53:34 2026-08-13 16:53:34 -04:00
amadou d1e911c499 vault backup: 2026-08-07 18:15:19 2026-08-07 18:15:20 -04:00
amadou 3ca8dc4da5 vault backup: 2026-08-07 16:37:57 2026-08-07 16:37:57 -04:00
amadou c4c751704d vault backup: 2026-08-07 16:30:27 2026-08-07 16:30:27 -04:00
amadou d8bc7854a8 vault backup: 2026-08-07 16:17:51 2026-08-07 16:17:51 -04:00
amadou a2947dc4b9 vault backup: 2026-08-07 15:57:47 2026-08-07 15:57:47 -04:00
amadou d547c69223 vault backup: 2026-08-07 15:37:42 2026-08-07 15:37:42 -04:00
amadou b3fde4ad3f vault backup: 2026-08-07 15:17:38 2026-08-07 15:17:38 -04:00
amadou 090e1ac543 vault backup: 2026-08-06 19:16:27 2026-08-06 19:16:27 -04:00
amadou 2683340daa vault backup: 2026-08-06 17:56:25 2026-08-06 17:56:25 -04:00
amadou c8b1a11650 vault backup: 2026-08-06 11:36:30 2026-08-06 11:36:30 -04:00
amadou ae2405084f vault backup: 2026-08-06 11:16:25 2026-08-06 11:16:25 -04:00
amadou c1270fb446 vault backup: 2026-08-06 10:27:09 2026-08-06 10:27:10 -04:00
amadou 8b03138800 vault backup: 2026-08-06 10:07:04 2026-08-06 10:07:04 -04:00
amadou 9689941988 vault backup: 2026-08-06 07:26:11 2026-08-06 07:26:12 -04:00
amadou f993a929c1 vault backup: 2026-08-05 18:15:38 2026-08-05 18:15:38 -04:00
amadou 4003d1f73c vault backup: 2026-08-05 18:03:09 2026-08-05 18:03:09 -04:00
amadou 8404c827e4 vault backup: 2026-08-05 17:55:33 2026-08-05 17:55:33 -04:00
amadou f51493d8e3 vault backup: 2026-08-05 17:15:27 2026-08-05 17:15:27 -04:00
amadou c66b619e91 vault backup: 2026-08-05 16:55:08 2026-08-05 16:55:09 -04:00
amadou 45ecf91438 vault backup: 2026-08-05 16:34:47 2026-08-05 16:34:47 -04:00
amadou 83304232f0 vault backup: 2026-08-05 15:54:40 2026-08-05 15:54:40 -04:00
amadou 1896e9a8df vault backup: 2026-08-05 15:34:35 2026-08-05 15:34:35 -04:00
amadou acf776d98c vault backup: 2026-08-05 12:43:49 2026-08-05 12:43:49 -04:00
amadou bb54e04abe vault backup: 2026-08-05 11:51:14 2026-08-05 11:51:14 -04:00
amadou 0ef2bb0a02 vault backup: 2026-08-05 11:31:10 2026-08-05 11:31:10 -04:00
amadou acf96c99e3 vault backup: 2026-08-05 10:53:31 2026-08-05 10:53:31 -04:00
amadou 1b16ebe8e1 vault backup: 2026-08-05 10:13:22 2026-08-05 10:13:22 -04:00
amadou 9c591f1de3 vault backup: 2026-08-05 09:52:58 2026-08-05 09:52:58 -04:00
amadou 97497ad9d1 vault backup: 2026-08-05 09:32:53 2026-08-05 09:32:53 -04:00
amadou afb0b6f1d8 vault backup: 2026-08-05 09:12:48 2026-08-05 09:12:48 -04:00
amadou 867dd44385 vault backup: 2026-08-04 17:31:11 2026-08-04 17:31:11 -04:00
amadou 94f4050df0 vault backup: 2026-08-04 17:11:06 2026-08-04 17:11:06 -04:00
amadou 1c03b37bd7 vault backup: 2026-08-04 16:51:01 2026-08-04 16:51:01 -04:00
amadou d9d9f7d87c vault backup: 2026-08-04 16:30:56 2026-08-04 16:30:56 -04:00
amadou 75c47c489c vault backup: 2026-08-04 13:46:40 2026-08-04 13:46:40 -04:00
amadou 9e9e89fb40 vault backup: 2026-08-04 12:26:29 2026-08-04 12:26:29 -04:00
amadou d5b80ae760 vault backup: 2026-08-04 11:46:04 2026-08-04 11:46:04 -04:00
amadou 18c4587d69 vault backup: 2026-08-01 17:07:09 2026-08-01 17:07:09 -04:00
amadou 006017c6b2 vault backup: 2026-08-01 16:32:03 2026-08-01 16:32:03 -04:00
amadou 50341b49c4 vault backup: 2026-08-01 16:11:59 2026-08-01 16:11:59 -04:00
amadou f95fa35c0d vault backup: 2026-08-01 15:51:54 2026-08-01 15:51:54 -04:00
amadou e8dddbf25b vault backup: 2026-07-31 14:34:15 2026-07-31 14:34:15 -04:00
amadou 9962c3adc6 vault backup: 2026-07-31 13:14:04 2026-07-31 13:14:04 -04:00
amadou b78043863b vault backup: 2026-07-31 11:53:41 2026-07-31 11:53:41 -04:00
amadou 50f8253593 vault backup: 2026-07-31 11:18:37 2026-07-31 11:18:37 -04:00
amadou 4cf3a55f6c vault backup: 2026-07-31 10:58:33 2026-07-31 10:58:33 -04:00
amadou 9b1928a1cb vault backup: 2026-07-31 10:38:28 2026-07-31 10:38:28 -04:00
amadou b3ccbbd178 vault backup: 2026-07-31 05:32:51 2026-07-31 05:32:51 -04:00
amadou 09a4d96d06 vault backup: 2026-07-30 17:41:49 2026-07-30 17:41:49 -04:00
amadou ad91a431cf vault backup: 2026-07-30 17:01:43 2026-07-30 17:01:43 -04:00
amadou 4c8db1e7ce vault backup: 2026-07-30 11:43:16 2026-07-30 11:43:16 -04:00
amadou 4551f165d1 vault backup: 2026-07-30 09:42:40 2026-07-30 09:42:40 -04:00
amadou ef55ce6e0d vault backup: 2026-07-30 09:22:35 2026-07-30 09:22:35 -04:00
amadou fe2953a74a vault backup: 2026-07-29 17:01:45 2026-07-29 17:01:45 -04:00
amadou 8ba72586c3 vault backup: 2026-07-29 16:41:40 2026-07-29 16:41:40 -04:00
amadou b0fc0115d1 vault backup: 2026-07-29 16:21:35 2026-07-29 16:21:35 -04:00
amadou 658744e849 vault backup: 2026-07-29 15:41:28 2026-07-29 15:41:28 -04:00
amadou 4a9412863e vault backup: 2026-07-29 11:50:38 2026-07-29 11:50:38 -04:00
amadou 89d325f153 vault backup: 2026-07-29 10:04:27 2026-07-29 10:04:27 -04:00
amadou 928ebb9934 vault backup: 2026-07-29 09:44:23 2026-07-29 09:44:23 -04:00
amadou c3b9d37085 vault backup: 2026-07-29 09:24:18 2026-07-29 09:24:18 -04:00
amadou 047cd15e44 vault backup: 2026-07-29 08:44:12 2026-07-29 08:44:12 -04:00
amadou 5f46846369 vault backup: 2026-07-29 08:22:03 2026-07-29 08:22:03 -04:00
amadou 4d5a609251 vault backup: 2026-07-29 06:41:31 2026-07-29 06:41:31 -04:00
amadou 03c95c2a45 vault backup: 2026-07-29 05:49:17 2026-07-29 05:49:18 -04:00
amadou eae1c4e4ba vault backup: 2026-07-29 05:17:58 2026-07-29 05:17:58 -04:00
amadou cb45d46b76 vault backup: 2026-07-29 03:18:46 2026-07-29 03:18:46 -04:00
amadou 880c3316f3 vault backup: 2026-07-29 02:43:41 2026-07-29 02:43:41 -04:00
amadou b7b37acdd6 vault backup: 2026-07-28 18:21:33 2026-07-28 18:21:33 -04:00
amadou a461c5461c vault backup: 2026-07-28 18:01:28 2026-07-28 18:01:28 -04:00
amadou b171d181a5 vault backup: 2026-07-28 17:41:22 2026-07-28 17:41:22 -04:00
amadou 142acc2c1f vault backup: 2026-07-28 17:21:17 2026-07-28 17:21:17 -04:00
amadou 30d2a83f91 vault backup: 2026-07-28 15:01:00 2026-07-28 15:01:00 -04:00
amadou 589ca1b320 vault backup: 2026-07-28 14:40:55 2026-07-28 14:40:56 -04:00
amadou 70dc3933bd vault backup: 2026-07-28 14:20:51 2026-07-28 14:20:51 -04:00
amadou 80e42cbe7d vault backup: 2026-07-28 11:28:19 2026-07-28 11:28:19 -04:00
amadou b38ca7f944 vault backup: 2026-07-28 11:08:14 2026-07-28 11:08:14 -04:00
amadou c1ceab1c4b vault backup: 2026-07-28 10:37:00 2026-07-28 10:37:00 -04:00
amadou 8507cd5a3c vault backup: 2026-07-28 10:16:56 2026-07-28 10:16:56 -04:00
amadou c859107c48 vault backup: 2026-07-28 08:01:23 2026-07-28 08:01:23 -04:00
amadou 7e52bff001 vault backup: 2026-07-27 17:47:07 2026-07-27 17:47:07 -04:00
amadou c20bed698d vault backup: 2026-07-27 17:27:02 2026-07-27 17:27:02 -04:00
amadou 623d255f42 vault backup: 2026-07-27 17:06:58 2026-07-27 17:06:58 -04:00
amadou 6923f72d82 vault backup: 2026-07-27 14:15:09 2026-07-27 14:15:09 -04:00
amadou 688bed4336 vault backup: 2026-07-27 13:55:03 2026-07-27 13:55:03 -04:00
amadou f0e9093fc4 vault backup: 2026-07-27 13:34:59 2026-07-27 13:34:59 -04:00
amadou a7418754fe vault backup: 2026-07-27 11:30:51 2026-07-27 11:30:51 -04:00
amadou b7304d5d36 vault backup: 2026-07-27 10:10:36 2026-07-27 10:10:36 -04:00
amadou 066f491d39 vault backup: 2026-07-27 09:30:30 2026-07-27 09:30:30 -04:00
amadou 25206c6ff1 vault backup: 2026-07-23 15:31:20 2026-07-23 15:31:20 +02:00
amadou 5f9bdcd151 vault backup: 2026-07-23 15:22:22 2026-07-23 15:22:22 +02:00
amadou f35c5873fe vault backup: 2026-07-23 15:17:59 2026-07-23 15:17:59 +02:00
amadou 8526cf4212 vault backup: 2026-07-23 14:57:54 2026-07-23 14:57:54 +02:00
amadou 0527e561b3 vault backup: 2026-07-23 14:36:35 2026-07-23 14:36:35 +02:00
amadou af0951d4db vault backup: 2026-07-23 07:56:59 2026-07-23 07:56:59 -04:00
amadou 1033a565cb vault backup: 2026-07-23 07:53:56 2026-07-23 07:53:56 -04:00
amadou 72b42ebcaf vault backup: 2026-07-23 07:40:50 2026-07-23 07:40:50 -04:00
amadou c3b430d0f6 vault backup: 2026-07-23 13:35:00 2026-07-23 13:35:00 +02:00
amadou e927fe12c4 vault backup: 2026-07-23 10:53:54 2026-07-23 10:53:54 +02:00
amadou b0fbd99b92 vault backup: 2026-07-23 10:32:18 2026-07-23 10:32:18 +02:00
amadou a3359218b4 vault backup: 2026-07-23 02:14:48 2026-07-23 02:14:48 -04:00
amadou 8c3828ae79 vault backup: 2026-07-22 23:05:35 2026-07-22 23:05:36 +02:00
amadou 4496907819 vault backup: 2026-07-22 22:28:47 2026-07-22 22:28:47 +02:00
amadou 3dca18bddc vault backup: 2026-07-22 19:32:35 2026-07-22 19:32:35 +02:00
amadou 82fd8888e0 vault backup: 2026-07-22 05:18:54 2026-07-22 05:18:54 -04:00
amadou c8a9326785 Merge vault changes and clean Obsidian local files 2026-07-22 05:18:02 -04:00
amadou e3f985a3c1 vault backup: 2026-07-22 04:52:02 2026-07-22 04:52:02 -04:00
amadou 2f654ebaec vault backup: 2026-07-21 11:36:51 2026-07-21 11:36:51 -04:00
amadou 6facceae59 vault backup: 2026-07-19 12:17:15 2026-07-19 12:17:15 -04:00
292 changed files with 254777 additions and 1096 deletions
+10
View File
@@ -0,0 +1,10 @@
**/.DS_Store
/.obsidian/workspace.json
/.DS_Store
# Ignore Smart Environment folder
.smart-env.weekly-review-tmp/
.smart-env/
+10 -1
View File
@@ -1 +1,10 @@
{}
{
"alwaysUpdateLinks": true,
"pdfExportSettings": {
"includeName": true,
"pageSize": "Letter",
"landscape": false,
"margin": "0",
"downscalePercent": 100
}
}
+9 -2
View File
@@ -1,8 +1,15 @@
[
"obsidian-git",
"iconic",
"folder-links",
"settings-search",
"omnisearch",
"auto-gitkeep"
"editing-toolbar",
"obsidian-local-rest-api",
"notebook-navigator",
"templater-obsidian",
"obsidian-git",
"auto-gitkeep",
"dataview",
"smart-connections",
"smart-lookup"
]
+1 -1
View File
@@ -17,6 +17,6 @@
"repelStrength": 10,
"linkStrength": 1,
"linkDistance": 250,
"scale": 1,
"scale": 0.28728300058735007,
"close": true
}
+47
View File
@@ -0,0 +1,47 @@
{
"file-explorer:new-file": [],
"notebook-navigator:new-note": [
{
"modifiers": [
"Mod"
],
"key": "N"
}
],
"notebook-navigator:open": [
{
"modifiers": [
"Mod",
"Shift"
],
"key": "E"
}
],
"templater-obsidian:replace-in-file-templater": [
{
"modifiers": [
"Mod",
"Shift"
],
"key": "I"
}
],
"templater-obsidian:insert-templater": [
{
"modifiers": [
"Mod",
"Shift"
],
"key": "M"
}
],
"templater-obsidian:create-new-note-from-template": [
{
"modifiers": [
"Mod",
"Shift"
],
"key": "B"
}
]
}
+20876
View File
File diff suppressed because one or more lines are too long
+11
View File
@@ -0,0 +1,11 @@
{
"id": "dataview",
"name": "Dataview",
"version": "0.5.68",
"minAppVersion": "0.13.11",
"description": "Complex data views for the data-obsessed.",
"author": "Michael Brenan <blacksmithgu@gmail.com>",
"authorUrl": "https://github.com/blacksmithgu",
"helpUrl": "https://blacksmithgu.github.io/obsidian-dataview/",
"isDesktopOnly": false
}
+141
View File
@@ -0,0 +1,141 @@
.block-language-dataview {
overflow-y: auto;
}
/*****************/
/** Table Views **/
/*****************/
/* List View Default Styling; rendered internally as a table. */
.table-view-table {
width: 100%;
}
.table-view-table > thead > tr, .table-view-table > tbody > tr {
margin-top: 1em;
margin-bottom: 1em;
text-align: left;
}
.table-view-table > tbody > tr:hover {
background-color: var(--table-row-background-hover);
}
.table-view-table > thead > tr > th {
font-weight: 700;
font-size: larger;
border-top: none;
border-left: none;
border-right: none;
border-bottom: solid;
max-width: 100%;
}
.table-view-table > tbody > tr > td {
text-align: left;
border: none;
font-weight: 400;
max-width: 100%;
}
.table-view-table ul, .table-view-table ol {
margin-block-start: 0.2em !important;
margin-block-end: 0.2em !important;
}
/** Rendered value styling for any view. */
.dataview-result-list-root-ul {
padding: 0em !important;
margin: 0em !important;
}
.dataview-result-list-ul {
margin-block-start: 0.2em !important;
margin-block-end: 0.2em !important;
}
/** Generic grouping styling. */
.dataview.result-group {
padding-left: 8px;
}
/*******************/
/** Inline Fields **/
/*******************/
.dataview.inline-field-key {
padding-left: 8px;
padding-right: 8px;
font-family: var(--font-monospace);
background-color: var(--background-primary-alt);
color: var(--nav-item-color-selected);
}
.dataview.inline-field-value {
padding-left: 8px;
padding-right: 8px;
font-family: var(--font-monospace);
background-color: var(--background-secondary-alt);
color: var(--nav-item-color-selected);
}
.dataview.inline-field-standalone-value {
padding-left: 8px;
padding-right: 8px;
font-family: var(--font-monospace);
background-color: var(--background-secondary-alt);
color: var(--nav-item-color-selected);
}
/***************/
/** Task View **/
/***************/
.dataview.task-list-item, .dataview.task-list-basic-item {
margin-top: 3px;
margin-bottom: 3px;
transition: 0.4s;
}
.dataview.task-list-item:hover, .dataview.task-list-basic-item:hover {
background-color: var(--text-selection);
box-shadow: -40px 0 0 var(--text-selection);
cursor: pointer;
}
/*****************/
/** Error Views **/
/*****************/
div.dataview-error-box {
width: 100%;
min-height: 150px;
display: flex;
align-items: center;
justify-content: center;
border: 4px dashed var(--background-secondary);
}
.dataview-error-message {
color: var(--text-muted);
text-align: center;
}
/*************************/
/** Additional Metadata **/
/*************************/
.dataview.small-text {
font-size: smaller;
color: var(--text-muted);
margin-left: 3px;
}
.dataview.small-text::before {
content: "(";
}
.dataview.small-text::after {
content: ")";
}
+541
View File
@@ -0,0 +1,541 @@
{
"lastVersion": "4.0.11",
"aestheticStyle": "default",
"positionStyle": "top",
"menuCommands": [
{
"id": "editing-toolbar:editor-undo",
"name": "Undo Edit",
"icon": "undo-glyph"
},
{
"id": "editing-toolbar:editor-redo",
"name": "Redo Edit",
"icon": "redo-glyph"
},
{
"id": "editing-toolbar:toggle-format-brush",
"name": "Format Brush",
"icon": "paintbrush"
},
{
"id": "editing-toolbar:format-eraser",
"name": "Clear Text Formatting",
"icon": "eraser"
},
{
"id": "editing-toolbar:header2-text",
"name": "Header 2",
"icon": "header-2"
},
{
"id": "editing-toolbar:header3-text",
"name": "Header 3",
"icon": "header-3"
},
{
"id": "SubmenuCommands-header",
"name": "submenu",
"icon": "header-n",
"SubmenuCommands": [
{
"id": "editing-toolbar:header1-text",
"name": "Header 1",
"icon": "header-1"
},
{
"id": "editing-toolbar:header4-text",
"name": "Header 4",
"icon": "header-4"
},
{
"id": "editing-toolbar:header5-text",
"name": "Header 5",
"icon": "header-5"
},
{
"id": "editing-toolbar:header6-text",
"name": "Header 6",
"icon": "header-6"
}
]
},
{
"id": "editing-toolbar:toggle-bold",
"name": "Bold",
"icon": "bold-glyph"
},
{
"id": "editing-toolbar:toggle-italics",
"name": "Italic",
"icon": "italic-glyph"
},
{
"id": "editing-toolbar:toggle-strikethrough",
"name": "Strikethrough",
"icon": "strikethrough-glyph"
},
{
"id": "editing-toolbar:underline",
"name": "Underline",
"icon": "underline-glyph"
},
{
"id": "editing-toolbar:toggle-highlight",
"name": "Highlight",
"icon": "highlight-glyph"
},
{
"id": "SubmenuCommands-text-tools",
"name": "Text Tools",
"icon": "box",
"menuType": "dropdown",
"SubmenuCommands": [
{
"id": "editing-toolbar:get-plain-text",
"name": "Get Plain Text",
"icon": "lucide-file-text"
},
{
"id": "editing-toolbar:smart-symbols",
"name": "Full Half Converter",
"icon": "lucide-at-sign"
},
{
"id": "editingToolbar-Divider-Line",
"name": "Line Operations",
"icon": "vertical-split"
},
{
"id": "editing-toolbar:insert-blank-lines",
"name": "Insert Blank Lines",
"icon": "lucide-space"
},
{
"id": "editing-toolbar:remove-blank-lines",
"name": "Remove Blank Lines",
"icon": "lucide-minimize-2"
},
{
"id": "editing-toolbar:split-lines",
"name": "Split Lines",
"icon": "lucide-split"
},
{
"id": "editing-toolbar:merge-lines",
"name": "Merge Lines",
"icon": "lucide-merge"
},
{
"id": "editing-toolbar:dedupe-lines",
"name": "Dedupe Lines",
"icon": "lucide-filter"
},
{
"id": "editingToolbar-Divider-Line",
"name": "Text Processing",
"icon": "vertical-split"
},
{
"id": "editing-toolbar:add-wrap",
"name": "Add Prefix/Suffix",
"icon": "lucide-wrap-text"
},
{
"id": "editing-toolbar:number-lines",
"name": "Number Lines (Custom)",
"icon": "lucide-list-ordered"
},
{
"id": "editing-toolbar:remove-whitespace-trim",
"name": "Trim Line Ends",
"icon": "lucide-scissors"
},
{
"id": "editing-toolbar:remove-whitespace-compress",
"name": "Shrink Extra Spaces",
"icon": "lucide-minimize"
},
{
"id": "editing-toolbar:remove-whitespace-all",
"name": "Remove All Whitespace",
"icon": "lucide-eraser"
},
{
"id": "editingToolbar-Divider-Line",
"name": "Advanced Tools",
"icon": "vertical-split"
},
{
"id": "editing-toolbar:list-to-table",
"name": "List to Table",
"icon": "lucide-table"
},
{
"id": "editing-toolbar:table-to-list",
"name": "Table to List",
"icon": "lucide-list"
},
{
"id": "editing-toolbar:extract-between",
"name": "Extract Between Strings",
"icon": "lucide-brackets"
}
]
},
{
"id": "SubmenuCommands-lucdf3en5",
"name": "submenu",
"icon": "edit",
"SubmenuCommands": [
{
"id": "editing-toolbar:editor-cut",
"name": "Cut",
"icon": "lucide-scissors"
},
{
"id": "editing-toolbar:editor-copy",
"name": "Copy",
"icon": "lucide-copy"
},
{
"id": "editing-toolbar:editor-paste",
"name": "Paste",
"icon": "lucide-clipboard-type"
},
{
"id": "editing-toolbar:editor:swap-line-down",
"name": "Swap Line Down",
"icon": "lucide-corner-right-down"
},
{
"id": "editing-toolbar:editor:swap-line-up",
"name": "Swap Line Up",
"icon": "lucide-corner-right-up"
}
]
},
{
"id": "editing-toolbar:editor:attach-file",
"name": "Attach File",
"icon": "lucide-paperclip"
},
{
"id": "editing-toolbar:editor:insert-table",
"name": "Insert Table",
"icon": "lucide-table"
},
{
"id": "editing-toolbar:editor:cycle-list-checklist",
"name": "Cycle List and Checklist",
"icon": "check-circle"
},
{
"id": "SubmenuCommands-luc8efull",
"name": "submenu",
"icon": "message-square",
"SubmenuCommands": [
{
"id": "editing-toolbar:editor:toggle-blockquote",
"name": "Blockquote",
"icon": "lucide-text-quote"
},
{
"id": "editing-toolbar:insert-callout",
"name": "Callout",
"icon": "lucide-quote"
}
]
},
{
"id": "SubmenuCommands-mdcmder",
"name": "submenu",
"icon": "<svg width=\"18\" height=\"18\" focusable=\"false\" fill=\"currentColor\" viewBox=\"0 0 1024 1024\"><g transform=\"scale(1, -1) translate(0, -896) scale(0.9, 0.9) \"><path class=\"path\" d=\"M464 608 l0 -568 q0 -3 -2.5 -5.5 q-2.5 -2.5 -5.5 -2.5 l-80 0 q-3 0 -5.5 2.5 q-2.5 2.5 -2.5 5.5 l0 568 l-232 0 q-3 0 -5.5 2.5 q-2.5 2.5 -2.5 5.5 l0 80 q0 3 2.5 5.5 q2.5 2.5 5.5 2.5 l560 0 q3 0 5.5 -2.5 q2.5 -2.5 2.5 -5.5 l0 -80 q0 -3 -2.5 -5.5 q-2.5 -2.5 -5.5 -2.5 l-232 0 ZM864 696 q17 0 28.5 11.5 q11.5 11.5 11.5 28.5 q0 17 -11.5 28.5 q-11.5 11.5 -28.5 11.5 q-17 0 -28.5 -11.5 q-11.5 -11.5 -11.5 -28.5 q0 -17 11.5 -28.5 q11.5 -11.5 28.5 -11.5 ZM864 640 q-40 0 -68 28 q-28 28 -28 68 q0 40 28 68 q28 28 68 28 q40 0 68 -28 q28 -28 28 -68 q0 -40 -28 -68 q-28 -28 -68 -28 ZM576 322 l0 -63 q0 -3 2 -5 l89 -70 l-89 -70 q-2 -2 -2 -5 l0 -63 q0 -4 3.5 -5.5 q3.5 -1.5 6.5 0.5 l170 133 q4 3 4.5 8.5 q0.5 5.5 -2.5 9.5 l-2 2 l-170 133 q-3 2 -6.5 0.5 q-3.5 -1.5 -3.5 -5.5 ZM256 322 l0 -63 q0 -3 -2 -5 l-89 -70 l89 -70 q2 -2 2 -5 l0 -63 q0 -4 -3.5 -5.5 q-3.5 -1.5 -6.5 0.5 l-170 133 q-4 3 -4.5 8.5 q-0.5 5.5 2.5 9.5 l2 2 l170 133 q3 2 6.5 0.5 q3.5 -1.5 3.5 -5.5 Z\"></path></g></svg>",
"SubmenuCommands": [
{
"id": "editing-toolbar:superscript",
"name": "Superscript",
"icon": "superscript-glyph"
},
{
"id": "editing-toolbar:subscript",
"name": "Subscript",
"icon": "subscript-glyph"
},
{
"id": "editing-toolbar:editor:toggle-code",
"name": "Inline Code",
"icon": "code-glyph"
},
{
"id": "editing-toolbar:codeblock",
"name": "Code Block",
"icon": "codeblock-glyph"
},
{
"id": "editing-toolbar:editor:insert-wikilink",
"name": "Wikilink",
"icon": "<svg width=\"15\" height=\"15\" focusable=\"false\" fill=\"currentColor\" viewBox=\"0 0 1024 1024\"><g transform=\"scale(1, -1) translate(0, -896) scale(0.9, 0.9) \"><path class=\"path\" d=\"M306 134 l91 0 q1 0 1 -8 l0 -80 q0 -8 -1 -8 l-91 0 q-1 0 -1 7 q0 -8 -5 -8 l-45 0 q-5 0 -5 8 l0 784 q0 8 5 8 l45 0 q5 0 5 -8 q0 8 1 8 l91 0 q1 0 1 -8 l0 -80 q0 -8 -1 -8 l-91 0 q-1 0 -1 8 l0 -623 q0 8 1 8 ZM139 134 l91 0 q1 0 1 -8 l0 -80 q0 -8 -1 -8 l-91 0 q-1 0 -1 7 q0 -8 -5 -8 l-45 0 q-5 0 -5 8 l0 784 q0 8 5 8 l45 0 q5 0 5 -8 q0 8 1 8 l91 0 q1 0 1 -8 l0 -80 q0 -8 -1 -8 l-91 0 q-1 0 -1 8 l0 -623 q0 8 1 8 ZM711 134 q1 0 1 -8 l0 623 q0 -8 -1 -8 l-91 0 q-1 0 -1 8 l0 80 q0 8 1 8 l91 0 q1 0 1 -8 q0 8 4 8 l46 0 q4 0 4 -8 l0 -784 q0 -8 -4 -8 l-46 0 q-4 0 -4 8 q0 -7 -1 -7 l-91 0 q-1 0 -1 8 l0 80 q0 8 1 8 l91 0 ZM878 134 q1 0 1 -8 l0 623 q0 -8 -1 -8 l-91 0 q-1 0 -1 8 l0 80 q0 8 1 8 l91 0 q1 0 1 -8 q0 8 5 8 l45 0 q4 0 4 -8 l0 -784 q0 -8 -4 -8 l-45 0 q-5 0 -5 8 q0 -7 -1 -7 l-91 0 q-1 0 -1 8 l0 80 q0 8 1 8 l91 0 Z\"></path></g></svg>"
},
{
"id": "editing-toolbar:editor:insert-embed",
"name": "Embed",
"icon": "note-glyph"
},
{
"id": "editing-toolbar:insert-link",
"name": "Link",
"icon": "link-glyph"
},
{
"id": "editing-toolbar:hrline",
"name": "Horizontal Divider",
"icon": "<svg width=\"18\" height=\"18\" focusable=\"false\" fill=\"currentColor\" viewBox=\"0 0 1024 1024\"><g transform=\"scale(1, -1) translate(0, -896) scale(0.9, 0.9) \"><path class=\"path\" d=\"M912 424 l0 -80 q0 -3 -2.5 -5.5 q-2.5 -2.5 -5.5 -2.5 l-784 0 q-3 0 -5.5 2.5 q-2.5 2.5 -2.5 5.5 l0 80 q0 3 2.5 5.5 q2.5 2.5 5.5 2.5 l784 0 q3 0 5.5 -2.5 q2.5 -2.5 2.5 -5.5 Z\"></path></g></svg>"
},
{
"id": "editing-toolbar:toggle-inline-math",
"name": "Inline Math",
"icon": "lucide-sigma"
},
{
"id": "editing-toolbar:editor:insert-mathblock",
"name": "MathBlock",
"icon": "lucide-sigma-square"
}
]
},
{
"id": "SubmenuCommands-list",
"name": "submenu-list",
"icon": "bullet-list-glyph",
"SubmenuCommands": [
{
"id": "editing-toolbar:editor:toggle-checklist-status",
"name": "Checklist",
"icon": "checkbox-glyph"
},
{
"id": "editing-toolbar:renumber-ordered-list",
"name": "Renumber Ordered List",
"icon": "list-restart"
},
{
"id": "editing-toolbar:toggle-numbered-list",
"name": "Ordered List",
"icon": "<svg width=\"18\" height=\"18\" focusable=\"false\" fill=\"currentColor\" viewBox=\"0 0 1024 1024\"><g transform=\"scale(1, -1) translate(0, -896) scale(0.9, 0.9) \"><path class=\"path\" d=\"M860 424 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-457 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l457 0 ZM860 756 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-457 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l457 0 ZM860 92 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-457 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l457 0 ZM264 136 l-3 -3 l-51 -57 l56 0 q14 0 24.5 -10 q10.5 -10 11.5 -25 l0 -1 q0 -15 -10.5 -25.5 q-10.5 -10.5 -24.5 -10.5 l-137 0 q-15 0 -25 10 q-10 10 -11 24.5 q-1 14.5 9 25.5 l63 70 l49 54 q7 7 7 16.5 q0 9.5 -7.5 16.5 q-7.5 7 -18.5 7 q-11 0 -18.5 -6.5 q-7.5 -6.5 -8.5 -16.5 l0 0 q0 -15 -10.5 -25.5 q-10.5 -10.5 -25.5 -10.5 q-15 0 -25.5 10.5 q-10.5 10.5 -10.5 25.5 q0 26 13.5 47.5 q13.5 21.5 36 34.5 q22.5 13 49 13 q26.5 0 49.5 -13 q23 -13 36 -34.5 q13 -21.5 13 -47.5 q0 -20 -7.5 -37.5 q-7.5 -17.5 -21.5 -30.5 l-1 -1 ZM173 794 q11 11 25 10.5 q14 -0.5 24.5 -10.5 q10.5 -10 10.5 -25 l0 -293 q0 -15 -10 -25.5 q-10 -10.5 -25 -10.5 q-15 0 -25.5 10 q-10.5 10 -11.5 25 l0 211 q-10 -8 -23.5 -7 q-13.5 1 -22.5 11 l-1 0 q-10 11 -9.5 25.5 q0.5 14.5 10.5 24.5 l58 54 Z\"></path></g></svg>"
},
{
"id": "editing-toolbar:toggle-bullet-list",
"name": "Unordered List",
"icon": "<svg width=\"18\" height=\"18\" focusable=\"false\" fill=\"currentColor\" viewBox=\"0 0 1024 1024\"><g transform=\"scale(1, -1) translate(0, -896) scale(0.9, 0.9) \"><path class=\"path\" d=\"M860 424 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-477 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l477 0 ZM860 756 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-477 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l477 0 ZM860 92 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-477 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l477 0 ZM176 716 l0 0 ZM112 716 q0 -27 18.5 -45.5 q18.5 -18.5 45.5 -18.5 q27 0 45.5 18.5 q18.5 18.5 18.5 45.5 q0 27 -18.5 45.5 q-18.5 18.5 -45.5 18.5 q-27 0 -45.5 -18.5 q-18.5 -18.5 -18.5 -45.5 ZM176 384 l0 0 ZM112 384 q0 -27 18.5 -45.5 q18.5 -18.5 45.5 -18.5 q27 0 45.5 18.5 q18.5 18.5 18.5 45.5 q0 27 -18.5 45.5 q-18.5 18.5 -45.5 18.5 q-27 0 -45.5 -18.5 q-18.5 -18.5 -18.5 -45.5 ZM176 52 l0 0 ZM112 52 q0 -27 18.5 -45.5 q18.5 -18.5 45.5 -18.5 q27 0 45.5 18.5 q18.5 18.5 18.5 45.5 q0 27 -18.5 45.5 q-18.5 18.5 -45.5 18.5 q-27 0 -45.5 -18.5 q-18.5 -18.5 -18.5 -45.5 Z\"></path></g></svg>"
},
{
"id": "editing-toolbar:undent-list",
"name": "Unindent List",
"icon": "<svg width=\"18\" height=\"18\" focusable=\"false\" fill=\"currentColor\" viewBox=\"0 0 1024 1024\"><g transform=\"scale(1, -1) translate(0, -896) scale(0.9, 0.9) \"><path class=\"path\" d=\"M872 302 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-429 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l429 0 ZM872 542 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-429 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l429 0 ZM872 784 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-721 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l721 0 ZM872 62 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-721 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l721 0 ZM244 534 l-123 -122 q-8 -7 -8 -18 q0 -11 8 -18 l123 -122 q8 -7 19 -7 q11 0 18.5 7.5 q7.5 7.5 7.5 18.5 l0 242 q0 11 -7.5 18.5 q-7.5 7.5 -18.5 7.5 q-11 0 -19 -7 Z\"></path></g></svg>"
},
{
"id": "editing-toolbar:indent-list",
"name": "Indent list",
"icon": "<svg width=\"18\" height=\"18\" focusable=\"false\" fill=\"currentColor\" viewBox=\"0 0 1024 1024\"><g transform=\"scale(1, -1) translate(0, -896) scale(0.9, 0.9) \"><path class=\"path\" d=\"M872 302 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-429 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l429 0 ZM872 542 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-429 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l429 0 ZM872 784 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-721 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l721 0 ZM872 62 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-721 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l721 0 ZM158 534 l124 -122 q7 -7 7 -18 q0 -11 -7 -18 l-124 -122 q-7 -7 -18 -7 q-11 0 -19 7.5 q-8 7.5 -8 18.5 l0 242 q0 11 8 18.5 q8 7.5 19 7.5 q11 0 18 -7 Z\"></path></g></svg>"
}
]
},
{
"id": "SubmenuCommands-aligin",
"name": "submenu-aligin",
"icon": "<svg width=\"18\" height=\"18\" focusable=\"false\" fill=\"currentColor\" viewBox=\"0 0 1024 1024\"><g transform=\"scale(1, -1) translate(0, -896) scale(0.9, 0.9) \"><path class=\"path\" d=\"M724 304 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-421 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l421 0 ZM872 540 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-721 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l721 0 ZM724 776 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-421 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l421 0 ZM872 68 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-721 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l721 0 Z\"></path></g></svg>",
"SubmenuCommands": [
{
"id": "editing-toolbar:justify",
"name": "Justify Text",
"icon": "<svg width=\"18\" height=\"18\" focusable=\"false\" fill=\"currentColor\" viewBox=\"0 0 1024 1024\"><g transform=\"scale(1, -1) translate(0, -896) scale(0.9, 0.9) \"><path class=\"path\" d=\"M112 736 l0 0 ZM120 736 l784 0 q8 0 8 -8 l0 -80 q0 -8 -8 -8 l-784 0 q-8 0 -8 8 l0 80 q0 8 8 8 ZM112 331 l0 0 ZM120 331 l784 0 q8 0 8 -8 l0 -80 q0 -8 -8 -8 l-784 0 q-8 0 -8 8 l0 80 q0 8 8 8 ZM112 128 l0 0 ZM120 128 l784 0 q8 0 8 -8 l0 -80 q0 -8 -8 -8 l-784 0 q-8 0 -8 8 l0 80 q0 8 8 8 ZM112 533 l0 0 ZM120 533 l784 0 q8 0 8 -8 l0 -80 q0 -8 -8 -8 l-784 0 q-8 0 -8 8 l0 80 q0 8 8 8 Z\"></path></g></svg>"
},
{
"id": "editing-toolbar:left",
"name": "Align Text Left",
"icon": "<svg width=\"18\" height=\"18\" focusable=\"false\" fill=\"currentColor\" viewBox=\"0 0 1024 1024\"><g transform=\"scale(1, -1) translate(0, -896) scale(0.9, 0.9) \"><path class=\"path\" d=\"M572 304 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-421 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l421 0 ZM872 540 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-721 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l721 0 ZM572 776 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-421 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l421 0 ZM872 68 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-721 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l721 0 Z\"></path></g></svg>"
},
{
"id": "editing-toolbar:center",
"name": "Center Text",
"icon": "<svg width=\"18\" height=\"18\" focusable=\"false\" fill=\"currentColor\" viewBox=\"0 0 1024 1024\"><g transform=\"scale(1, -1) translate(0, -896) scale(0.9, 0.9) \"><path class=\"path\" d=\"M724 304 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-421 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l421 0 ZM872 540 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-721 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l721 0 ZM724 776 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-421 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l421 0 ZM872 68 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-721 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l721 0 Z\"></path></g></svg>"
},
{
"id": "editing-toolbar:right",
"name": "Align Text Right",
"icon": "<svg width=\"18\" height=\"18\" focusable=\"false\" fill=\"currentColor\" viewBox=\"0 0 1024 1024\"><g transform=\"scale(1, -1) translate(0, -896) scale(0.9, 0.9) \"><path class=\"path\" d=\"M872 304 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-421 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l421 0 ZM872 540 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-721 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l721 0 ZM872 776 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-421 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l421 0 ZM872 68 q17 0 28.5 -11.5 q11.5 -11.5 11.5 -28 q0 -16.5 -11.5 -28.5 q-11.5 -12 -27.5 -12 l-721 0 q-17 0 -28.5 11.5 q-11.5 11.5 -11.5 28 q0 16.5 11.5 28.5 q11.5 12 27.5 12 l721 0 Z\"></path></g></svg>"
}
]
},
{
"id": "editing-toolbar:change-font-color",
"name": "Change Font Color",
"icon": "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" focusable=\"false\" fill=\"currentColor\"><g fill-rule=\"evenodd\"><path id=\"change-font-color-icon\" d=\"M3 18h18v3H3z\" style=\"fill:#2DC26B\"></path><path d=\"M8.7 16h-.8a.5.5 0 01-.5-.6l2.7-9c.1-.3.3-.4.5-.4h2.8c.2 0 .4.1.5.4l2.7 9a.5.5 0 01-.5.6h-.8a.5.5 0 01-.4-.4l-.7-2.2c0-.3-.3-.4-.5-.4h-3.4c-.2 0-.4.1-.5.4l-.7 2.2c0 .3-.2.4-.4.4zm2.6-7.6l-.6 2a.5.5 0 00.5.6h1.6a.5.5 0 00.5-.6l-.6-2c0-.3-.3-.4-.5-.4h-.4c-.2 0-.4.1-.5.4z\"></path></g></svg>"
},
{
"id": "editing-toolbar:change-background-color",
"name": "Change Background Color",
"icon": "<svg width=\"18\" height=\"24\" viewBox=\"0 0 256 256\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\"><g stroke=\"none\" stroke-width=\"1\" fill=\"currentColor\" fill-rule=\"evenodd\"><g ><g fill=\"currentColor\"><g transform=\"translate(119.502295, 137.878331) rotate(-135.000000) translate(-119.502295, -137.878331) translate(48.002295, 31.757731)\" ><path d=\"M100.946943,60.8084699 L43.7469427,60.8084699 C37.2852111,60.8084699 32.0469427,66.0467383 32.0469427,72.5084699 L32.0469427,118.70847 C32.0469427,125.170201 37.2852111,130.40847 43.7469427,130.40847 L100.946943,130.40847 C107.408674,130.40847 112.646943,125.170201 112.646943,118.70847 L112.646943,72.5084699 C112.646943,66.0467383 107.408674,60.8084699 100.946943,60.8084699 Z M93.646,79.808 L93.646,111.408 L51.046,111.408 L51.046,79.808 L93.646,79.808 Z\" fill-rule=\"nonzero\"></path><path d=\"M87.9366521,16.90916 L87.9194966,68.2000001 C87.9183543,69.4147389 86.9334998,70.399264 85.7187607,70.4 L56.9423078,70.4 C55.7272813,70.4 54.7423078,69.4150264 54.7423078,68.2 L54.7423078,39.4621057 C54.7423078,37.2523513 55.5736632,35.1234748 57.0711706,33.4985176 L76.4832996,12.4342613 C78.9534987,9.75382857 83.1289108,9.5834005 85.8093436,12.0535996 C87.1658473,13.303709 87.9372691,15.0644715 87.9366521,16.90916 Z\" fill-rule=\"evenodd\"></path><path d=\"M131.3,111.241199 L11.7,111.241199 C5.23826843,111.241199 0,116.479467 0,122.941199 L0,200.541199 C0,207.002931 5.23826843,212.241199 11.7,212.241199 L131.3,212.241199 C137.761732,212.241199 143,207.002931 143,200.541199 L143,122.941199 C143,116.479467 137.761732,111.241199 131.3,111.241199 Z M124,130.241 L124,193.241 L19,193.241 L19,130.241 L124,130.241 Z\" fill-rule=\"nonzero\"></path></g></g><path d=\"M51,218 L205,218 C211.075132,218 216,222.924868 216,229 C216,235.075132 211.075132,240 205,240 L51,240 C44.9248678,240 40,235.075132 40,229 C40,222.924868 44.9248678,218 51,218 Z\" id=\"change-background-color-icon\" style=\"fill:#FA541C\"></path></g></g></svg>"
},
{
"id": "editing-toolbar:fullscreen-focus",
"name": "Fullscreen Focus Mode",
"icon": "fullscreen"
},
{
"id": "editing-toolbar:workplace-fullscreen-focus",
"name": "Workplace Fullscreen",
"icon": "exit-fullscreen"
}
],
"followingCommands": [],
"topCommands": [],
"fixedCommands": [],
"mobileCommands": [],
"enableMultipleConfig": false,
"enableTopToolbar": true,
"enableFollowingToolbar": false,
"enableFixedToolbar": false,
"appendMethod": "workspace",
"shouldShowMenuOnSelect": false,
"cMenuVisibility": true,
"cMenuBottomValue": 4.25,
"cMenuNumRows": 12,
"cMenuWidth": 610,
"cMenuFontColor": "#2DC26B",
"cMenuBackgroundColor": "#ff4d4f",
"autohide": false,
"Iscentered": false,
"custom_bg1": "#FFB78B8C",
"custom_bg2": "#CDF4698C",
"custom_bg3": "#A0CCF68C",
"custom_bg4": "#F0A7D88C",
"custom_bg5": "#ADEFEF8C",
"custom_fc1": "#D83931",
"custom_fc2": "#DE7802",
"custom_fc3": "#245BDB",
"custom_fc4": "#6425D0",
"custom_fc5": "#646A73",
"isLoadOnMobile": false,
"horizontalPosition": 0,
"verticalPosition": 0,
"formatBrushes": {},
"customCommands": [],
"viewTypeSettings": {},
"appearanceByStyle": {
"top": {
"toolbarBackgroundColor": "rgba(var(--background-secondary-rgb), 0.7)",
"toolbarIconColor": "var(--text-normal)",
"toolbarIconSize": 18,
"aestheticStyle": "default"
},
"following": {
"toolbarBackgroundColor": "rgba(var(--background-secondary-rgb), 0.7)",
"toolbarIconColor": "var(--text-normal)",
"toolbarIconSize": 18,
"aestheticStyle": "default"
},
"fixed": {
"toolbarBackgroundColor": "rgba(var(--background-secondary-rgb), 0.7)",
"toolbarIconColor": "var(--text-normal)",
"toolbarIconSize": 18,
"aestheticStyle": "default"
},
"mobile": {
"toolbarBackgroundColor": "rgba(var(--background-secondary-rgb), 0.7)",
"toolbarIconColor": "var(--text-normal)",
"toolbarIconSize": 18,
"aestheticStyle": "default"
}
},
"toolbarBackgroundColor": "rgba(var(--background-secondary-rgb), 0.7)",
"toolbarIconColor": "var(--text-normal)",
"toolbarIconSize": 18,
"useCurrentLineForRegex": false,
"ai": {
"enabled": false,
"consentAccepted": false,
"onboardingShown": true,
"providerMode": "pkmer-first",
"enableInlineCompletion": true,
"inlineCompletionHintLearned": false,
"completionTrigger": "manual",
"completionDelay": 500,
"enableRewrite": true,
"showRewriteToolbarOnSelection": false,
"rewriteMinSelectionLength": 1,
"pkmerApiBaseUrl": "https://newapi.pkmer.cn",
"pkmerModel": "04-fast",
"pkmerModelRouting": {
"mode": "smart",
"completion": "04-fast",
"rewrite": "04-fast",
"reasoning": "03-agent",
"artifact": "03-agent"
},
"pkmer": {
"tokenExpiresAt": 0,
"userInfo": null
},
"enableCustomModel": false,
"customModel": {
"apiFormat": "openai-compatible",
"baseUrl": "",
"apiKey": "",
"model": "",
"temperature": 0.2
},
"frontmatterPrompt": {
"mode": "auto",
"properties": "title: concise, one-line note title\nsummary: 1-3 sentence note summary\ntags: YAML list of relevant keywords\ncreated: YYYY-MM-DD date when appropriate\ncategory: broad content category",
"language": "auto",
"prompt": "Generate YAML frontmatter for the current Obsidian note using the requested properties below.\n\nRequested properties:\n{properties}\n\nOutput language for generated values: {language}\n\nRules:\n- Return only one complete YAML frontmatter block wrapped in --- delimiters.\n- Use the target text as the note content.\n- Follow current and sibling-note frontmatter conventions from context when provided.\n- Keep values concise, practical, and useful for filtering or browsing.\n- Do not add explanations or markdown fences outside the YAML block."
},
"customPromptHistory": [],
"customPromptTemplates": [
{
"id": "template-demo-variables",
"name": "📝 Summarize Key Points",
"prompt": "Analyze the structure of {{file:content}} and focus on:\n{{selection}}\n\nPlease provide:\n1. A concise overview\n2. The key points\n3. Suggestions for improvement",
"icon": "lucide-sparkles"
},
{
"id": "template-task-variables",
"name": "Extract Tasks",
"prompt": "Today's date is {{date}}. Extract all actionable tasks from {{file:content}}, with special attention to:\n{{selection}}\n\nPlease output strictly in Obsidian Tasks plugin format, one task per line:\n\n- [ ] Task description ⏫/🔼/🔽/⏬ priority\n- [ ] Task description 📅 YYYY-MM-DD due date\n- [ ] Task description ⏰ YYYY-MM-DD HH:mm reminder\n- [ ] Task description 🛫 YYYY-MM-DD start date\n- [ ] Task description 🔁 every day/week/month recurrence\n- [ ] Task description #tag #project\n\nExtraction rules:\n1. If the text implies urgency such as urgent, ASAP, immediately, or today, add ⏫.\n2. If it implies near-term timing such as tomorrow, this week, or soon, add 🔼.\n3. Convert explicit dates to 📅 YYYY-MM-DD.\n4. Convert explicit times to ⏰ YYYY-MM-DD HH:mm when possible.\n5. Add recurrence for repeated work such as 🔁 every week/month.\n6. Add practical tags for each task.\n\nExample output:\n- [ ] Finish project report ⏫ 📅 2026-04-25 #work\n- [ ] Weekly team sync 🔁 every week on Monday ⏰ 09:00 #meeting\n- [ ] Follow up on client request 🔼 📅 2026-04-23 #follow-up",
"icon": "lucide-sparkles"
},
{
"id": "template-dataview",
"name": "Generate Dataview",
"prompt": "Help me generate an Obsidian Dataview query block based on my requirement. Requirements:\n1. Use DataviewJS or DQL syntax.\n2. Include the necessary filters and sorting.\n3. Add short comments explaining each part.\n4. Use DataviewJS if the logic is complex.\n\nMy requirement:",
"icon": "lucide-database"
},
{
"id": "template-templater",
"name": "Design Templater Template",
"prompt": "Help me design an Obsidian Templater template. Requirements:\n1. Use Templater syntax (<% %>).\n2. Include dynamic date, time, and similar variables.\n3. Support user input prompts.\n4. Add necessary conditionals and loops.\n5. Comment the purpose of each section.\n\nTemplate purpose:",
"icon": "lucide-file-code"
},
{
"id": "template-mermaid",
"name": "Create Mermaid Diagram",
"prompt": "Based on my selected text {{selection}}, generate Mermaid diagram code. Requirements:\n1. Choose an appropriate diagram type such as flowchart, sequence, class, or gantt.\n2. Use clear node names.\n3. Add useful styling and comments when needed.\n4. Ensure the syntax is valid and renderable.\n",
"icon": "lucide-workflow"
},
{
"id": "template-metadata",
"name": "Design YAML",
"prompt": "Based on the current note content {{file:content}}, help me design a suitable YAML Frontmatter structure for this note. Requirements:\n1. Recommend fields that fit the note content.\n2. Include common fields such as tags, aliases, and date.\n3. Suggest useful custom fields.\n4. Briefly explain the purpose of each field.\n\nNote type:",
"icon": "lucide-file-json"
},
{
"id": "template-callout",
"name": "Wrap with Callout",
"prompt": "Based on my selected text {{selection}}, wrap it using an Obsidian Callout block. Requirements:\n1. Choose an appropriate callout type such as note, tip, warning, or danger.\n2. Support nesting and folding when helpful.\n3. Include a title and content.\n4. Allow code blocks or lists when needed.\n\nContent requirement:",
"icon": "lucide-message-square"
}
]
}
}
File diff suppressed because one or more lines are too long
+10
View File
@@ -0,0 +1,10 @@
{
"id": "editing-toolbar",
"name": "Editing Toolbar",
"version": "4.0.11",
"minAppVersion": "0.14.0",
"description": "The Obsidian Editing Toolbar is modified from cmenu, which provides more powerful customization settings and has many built-in editing commands to be a MS Word-like toolbar editing experience.",
"author": "Cuman",
"authorUrl": "https://github.com/cumany/obsidian-editing-toolbar",
"isDesktopOnly": false
}
File diff suppressed because it is too large Load Diff
+1 -23
View File
@@ -28,29 +28,7 @@
},
"appIcons": {},
"tabIcons": {},
"fileIcons": {
"00 Inbox": {
"icon": "lucide-inbox"
},
"10 Knowledge": {
"icon": "lucide-school"
},
"20 Work": {
"icon": "lucide-building"
},
"30 Personal Projects": {
"icon": "lucide-user"
},
"40 Journal": {
"icon": "lucide-pen-tool"
},
"50 Principles": {
"icon": "lucide-star"
},
"90 Archives": {
"icon": "lucide-archive"
}
},
"fileIcons": {},
"bookmarkIcons": {},
"tagIcons": {},
"propertyIcons": {},
+1 -23
View File
@@ -28,29 +28,7 @@
},
"appIcons": {},
"tabIcons": {},
"fileIcons": {
"00 Inbox": {
"icon": "lucide-inbox"
},
"10 Knowledge": {
"icon": "lucide-school"
},
"20 Work": {
"icon": "lucide-building"
},
"30 Personal Projects": {
"icon": "lucide-user"
},
"40 Journal": {
"icon": "lucide-pen-tool"
},
"50 Principles": {
"icon": "lucide-star"
},
"90 Archives": {
"icon": "lucide-archive"
}
},
"fileIcons": {},
"bookmarkIcons": {},
"tagIcons": {},
"propertyIcons": {},
+1 -23
View File
@@ -28,29 +28,7 @@
},
"appIcons": {},
"tabIcons": {},
"fileIcons": {
"00 Inbox": {
"icon": "lucide-inbox"
},
"10 Knowledge": {
"icon": "lucide-school"
},
"20 Work": {
"icon": "lucide-building"
},
"30 Personal Projects": {
"icon": "lucide-user"
},
"40 Journal": {
"icon": "lucide-pen-tool"
},
"50 Principles": {
"icon": "lucide-star"
},
"90 Archives": {
"icon": "lucide-archive"
}
},
"fileIcons": {},
"bookmarkIcons": {},
"tagIcons": {},
"propertyIcons": {},
+568
View File
@@ -0,0 +1,568 @@
{
"vaultProfiles": [
{
"id": "default",
"name": "Default",
"fileVisibility": "supported",
"propertyKeys": [],
"hiddenFolders": [],
"descendantExcludedFolders": [],
"hiddenTags": [],
"hiddenFileNames": [],
"hiddenFileTags": [],
"hiddenFileProperties": [],
"navigationBanner": null,
"periodicNotesFolder": "20 Work/Journal",
"shortcuts": [
{
"type": "folder",
"path": "20 Work/Decisions"
},
{
"type": "folder",
"path": "20 Work/Meetings/Inbox"
}
],
"navRainbow": {
"mode": "none",
"balanceHueLuminance": true,
"separateThemeColors": false,
"shortcuts": {
"enabled": false,
"firstColor": "#ef4444",
"lastColor": "#8b5cf6",
"darkFirstColor": "#fb7185",
"darkLastColor": "#c084fc",
"transitionStyle": "rgb"
},
"recent": {
"enabled": false,
"firstColor": "#ef4444",
"lastColor": "#8b5cf6",
"darkFirstColor": "#fb7185",
"darkLastColor": "#c084fc",
"transitionStyle": "rgb"
},
"folders": {
"enabled": true,
"firstColor": "#ef4444",
"lastColor": "#8b5cf6",
"darkFirstColor": "#fb7185",
"darkLastColor": "#c084fc",
"transitionStyle": "hue",
"scope": "root"
},
"tags": {
"enabled": false,
"firstColor": "#ef4444",
"lastColor": "#8b5cf6",
"darkFirstColor": "#fb7185",
"darkLastColor": "#c084fc",
"transitionStyle": "hue",
"scope": "root"
},
"properties": {
"enabled": false,
"firstColor": "#ef4444",
"lastColor": "#8b5cf6",
"darkFirstColor": "#fb7185",
"darkLastColor": "#c084fc",
"transitionStyle": "hue",
"scope": "root"
}
}
}
],
"vaultProfile": "default",
"vaultTitle": "navigation",
"syncModes": {
"vaultProfile": "synced",
"homepage": "synced",
"folderSortOrder": "synced",
"tagSortOrder": "synced",
"propertySortOrder": "synced",
"includeDescendantNotes": "synced",
"useFloatingToolbars": "synced",
"dualPane": "synced",
"dualPaneOrientation": "synced",
"narrowSidebarLayout": "synced",
"narrowSidebarTriggerMode": "synced",
"narrowSidebarCustomWidth": "synced",
"paneTransitionDuration": "synced",
"toolbarVisibility": "synced",
"pinNavigationBanner": "synced",
"navIndent": "synced",
"navItemHeight": "synced",
"navItemHeightScaleText": "synced",
"calendarPlacement": "synced",
"calendarLeftPlacement": "synced",
"calendarWeeksToShow": "synced",
"compactItemHeight": "synced",
"compactItemHeightScaleText": "synced",
"featureImageSize": "synced",
"featureImagePixelSize": "synced",
"uiScale": "synced"
},
"createNewNotesInNewTab": false,
"autoRevealActiveFile": true,
"autoRevealShortestPath": true,
"autoRevealIgnoreRightSidebar": true,
"autoRevealIgnoreOtherWindows": true,
"paneTransitionDuration": 150,
"multiSelectModifier": "cmdCtrl",
"enterToOpenFiles": false,
"shiftEnterOpenContext": "tab",
"cmdCtrlEnterOpenContext": "split",
"mouseBackForwardAction": "history",
"startView": "files",
"showInfoButtons": true,
"homepage": {
"source": "none",
"file": null,
"createMissingPeriodicNote": true
},
"dualPane": true,
"dualPaneOrientation": "horizontal",
"narrowSidebarLayout": "vertical",
"narrowSidebarTriggerMode": "fitPanes",
"narrowSidebarCustomWidth": 350,
"showTooltips": false,
"showTooltipPath": true,
"showTooltipWordCount": false,
"desktopBackground": "separate",
"desktopScale": 1,
"mobileScale": 1,
"useFloatingToolbars": true,
"toolbarVisibility": {
"navigation": {
"toggleDualPane": true,
"expandCollapse": true,
"calendar": true,
"hiddenItems": true,
"rootReorder": true,
"newFolder": true
},
"list": {
"back": true,
"search": true,
"reveal": false,
"descendants": true,
"groupExpansion": false,
"sort": true,
"appearance": true,
"newNote": true
}
},
"interfaceIcons": {},
"colorIconOnly": false,
"dateFormat": "MMM D, YYYY",
"timeFormat": "h:mm a",
"calendarTemplateFolder": "",
"confirmBeforeDelete": true,
"deleteAttachments": "ask",
"moveFileConflicts": "ask",
"externalIconProviders": {},
"checkForUpdatesOnStart": true,
"pinNavigationBanner": true,
"showNoteCount": true,
"separateNoteCounts": true,
"showIndentGuides": false,
"navCountLeaderStyle": "none",
"rootLevelSpacing": 0,
"navIndent": 16,
"navItemHeight": 28,
"navItemHeightScaleText": true,
"collapseBehavior": "all",
"smartCollapse": true,
"excludeVaultRootFromCollapse": false,
"collapseOtherBranchesOnExpand": false,
"autoSelectFirstFileOnFocusChange": false,
"autoExpandNavItems": false,
"springLoadedFolders": true,
"springLoadedFoldersInitialDelay": 0.5,
"springLoadedFoldersSubsequentDelay": 0.5,
"showSectionIcons": true,
"showShortcuts": true,
"shortcutBadgeDisplay": "index",
"skipAutoScroll": false,
"showRecentNotes": true,
"hideRecentNotes": "none",
"pinRecentNotesWithShortcuts": false,
"recentNotesCount": 5,
"showFolderIcons": true,
"showRootFolder": true,
"inheritFolderColors": true,
"folderSortOrder": "alpha-asc",
"enableFolderNotes": true,
"folderNoteType": "markdown",
"folderNoteNamePattern": "{{folder}}",
"folderNoteTemplate": null,
"enableFolderNoteLinks": true,
"hideFolderNoteInList": true,
"pinCreatedFolderNote": false,
"folderNoteOpenLocation": "right-sidebar",
"showNearestFolderNoteInSidebar": true,
"showTags": true,
"showTagIcons": true,
"showAllTagsFolder": true,
"showUntagged": true,
"scopeTagsToCurrentContext": false,
"tagSortOrder": "alpha-asc",
"inheritTagColors": true,
"keepEmptyTagsProperty": false,
"showProperties": true,
"showPropertyIcons": true,
"inheritPropertyColors": true,
"propertySortOrder": "alpha-asc",
"showAllPropertiesFolder": true,
"scopePropertiesToCurrentContext": false,
"defaultListMode": "standard",
"includeDescendantNotes": false,
"defaultFolderSort": "modified-desc",
"defaultFolderSortPropertyKey": "",
"propertySortKey": "",
"propertyGroupKey": "",
"propertySortSecondary": "title",
"manualSortPropertyKey": "sort_index",
"manualSortGroupHeaderProperty": "group_header",
"manualSortNewNotePlacement": "below-selected-note",
"confirmBeforeManualSort": true,
"revealFileOnListChanges": true,
"listPaneTitle": "header",
"noteGrouping": "date",
"showSelectedNavigationPills": false,
"stickyGroupHeaders": true,
"showFolderGroupPaths": true,
"showGroupHeaderItemCounts": false,
"showCurrentFolderFilesAtBottom": false,
"filterPinnedByFolder": false,
"compactItemHeight": 28,
"compactItemHeightScaleText": true,
"showQuickActions": true,
"quickActionRevealInFolder": false,
"quickActionAddTag": true,
"quickActionAddToShortcuts": true,
"quickActionPinNote": true,
"quickActionOpenInNewTab": false,
"hideDrawingPreviewImages": true,
"useFrontmatterMetadata": false,
"frontmatterIconField": "icon",
"frontmatterColorField": "color",
"frontmatterBackgroundField": "background",
"frontmatterNameField": "",
"frontmatterCreatedField": "",
"frontmatterModifiedField": "",
"frontmatterDateFormat": "",
"showFileTaskProgress": true,
"showFileTaskProgressBar": true,
"showFileTaskProgressCount": true,
"hideFileTaskProgressWhenComplete": false,
"showFileBackgroundUnfinishedTask": false,
"unfinishedTaskBackgroundColor": "#ef000050",
"unfinishedTaskBackgroundColorDark": "#ef000050",
"showFileIcons": true,
"unfinishedTaskIcon": "compact",
"useFolderIconForFiles": false,
"showFilenameMatchIcons": false,
"fileNameIconMap": {},
"showCategoryIcons": false,
"fileTypeIconMap": {},
"fileTypeIconPreset": "none",
"fileNameRows": 1,
"useFolderColorForTitles": false,
"showFilePreview": true,
"skipHeadingsInPreview": true,
"skipCodeBlocksInPreview": true,
"skipCalloutsInPreview": false,
"stripHtmlInPreview": true,
"stripLatexInPreview": true,
"previewRows": 2,
"previewProperties": [],
"previewPropertiesFallback": true,
"showFeatureImage": true,
"featureImageProperties": [],
"featureImageExcludeProperties": [],
"featureImageSize": "64",
"featureImagePixelSize": "256",
"forceSquareFeatureImage": true,
"downloadExternalFeatureImages": true,
"showFileTags": true,
"colorFileTags": true,
"prioritizeColoredFileTags": true,
"showFileTagAncestors": false,
"showFileTagsInCompactMode": false,
"showFileProperties": true,
"colorFileProperties": true,
"prioritizeColoredFileProperties": true,
"showFilePropertiesInCompactMode": false,
"showPropertiesOnSeparateRows": false,
"enablePropertyInternalLinks": true,
"enablePropertyExternalLinks": true,
"textCountDisplay": "none",
"textCountPlacement": "title",
"characterCountSpaces": "include",
"wordCountTargetProperty": "word-goal",
"showWordCountPercentage": false,
"showFileDate": true,
"alphabeticalDateMode": "modified",
"showParentFolder": true,
"showParentFolderFullPath": false,
"parentFolderClickRevealsFile": false,
"showParentFolderColor": false,
"showParentFolderIcon": false,
"calendarEnabled": true,
"calendarPlacement": "right-sidebar",
"calendarConfirmBeforeCreate": true,
"calendarShowHiddenItems": false,
"calendarLocale": "system-default",
"calendarWeekendDays": "sat-sun",
"calendarMonthHeadingFormat": "full",
"calendarHighlightToday": true,
"calendarShowFeatureImage": true,
"calendarShowTasks": true,
"calendarMonthHighlights": {},
"calendarShowWeekNumber": false,
"calendarShowQuarter": false,
"calendarShowOutsideMonthDays": true,
"calendarShowYearCalendar": true,
"calendarLeftPlacement": "navigation",
"calendarWeeksToShow": 1,
"calendarIntegrationMode": "notebook-navigator",
"calendarPeriodicNotesLocaleSource": "calendar",
"calendarCustomFilePattern": "YYYY/YYYY-MM-DD",
"calendarCustomWeekPattern": "YYYY/[W]WW",
"calendarCustomMonthPattern": "YYYY/YYYY-MM",
"calendarCustomQuarterPattern": "YYYY/[Q]Q",
"calendarCustomYearPattern": "YYYY",
"calendarCustomFileTemplate": null,
"calendarCustomWeekTemplate": null,
"calendarCustomMonthTemplate": null,
"calendarCustomQuarterTemplate": null,
"calendarCustomYearTemplate": null,
"keyboardShortcuts": {
"pane:move-up": [
{
"key": "ArrowUp",
"modifiers": []
}
],
"pane:move-down": [
{
"key": "ArrowDown",
"modifiers": []
}
],
"pane:page-up": [
{
"key": "PageUp",
"modifiers": []
}
],
"pane:page-down": [
{
"key": "PageDown",
"modifiers": []
}
],
"pane:home": [
{
"key": "Home",
"modifiers": []
}
],
"pane:end": [
{
"key": "End",
"modifiers": []
}
],
"pane:rename": [
{
"key": "Enter",
"modifiers": []
}
],
"navigation:collapse-or-parent": [
{
"key": "ArrowLeft",
"modifiers": []
}
],
"navigation:expand-or-focus-list": [
{
"key": "ArrowRight",
"modifiers": []
}
],
"navigation:focus-list": [
{
"key": "Tab",
"modifiers": []
}
],
"pane:delete-selected": [
{
"key": "Delete",
"modifiers": []
},
{
"key": "Backspace",
"modifiers": []
}
],
"list:focus-navigation": [
{
"key": "ArrowLeft",
"modifiers": []
},
{
"key": "Tab",
"modifiers": [
"Shift"
]
}
],
"list:focus-editor": [
{
"key": "ArrowRight",
"modifiers": []
},
{
"key": "Tab",
"modifiers": []
}
],
"list:select-all": [
{
"key": "A",
"modifiers": [
"Mod"
]
}
],
"list:extend-selection-up": [
{
"key": "ArrowUp",
"modifiers": [
"Shift"
]
}
],
"list:extend-selection-down": [
{
"key": "ArrowDown",
"modifiers": [
"Shift"
]
}
],
"list:manual-sort-up": [
{
"key": "ArrowUp",
"modifiers": [
"Mod"
]
}
],
"list:manual-sort-down": [
{
"key": "ArrowDown",
"modifiers": [
"Mod"
]
}
],
"list:range-to-start": [
{
"key": "Home",
"modifiers": [
"Shift"
]
}
],
"list:range-to-end": [
{
"key": "End",
"modifiers": [
"Shift"
]
}
],
"search:focus-list": [
{
"key": "Tab",
"modifiers": []
},
{
"key": "Enter",
"modifiers": []
}
],
"search:focus-navigation": [
{
"key": "Tab",
"modifiers": [
"Shift"
]
}
],
"search:close": [
{
"key": "Escape",
"modifiers": []
}
]
},
"customVaultName": "",
"pinnedNotes": {},
"fileIcons": {},
"fileColors": {},
"fileBackgroundColors": {},
"folderIcons": {},
"folderColors": {},
"folderBackgroundColors": {},
"folderSortOverrides": {},
"folderTreeSortOverrides": {},
"folderAppearances": {},
"tagIcons": {},
"tagColors": {},
"tagBackgroundColors": {},
"tagSortOverrides": {},
"tagTreeSortOverrides": {},
"tagAppearances": {},
"propertyIcons": {},
"propertyColors": {},
"propertyBackgroundColors": {},
"propertySortOverrides": {},
"propertyTreeSortOverrides": {},
"propertyAppearances": {},
"virtualFolderColors": {},
"virtualFolderBackgroundColors": {},
"navigationSeparators": {},
"userColors": [
"#ffffff",
"#d9d9d9",
"#a6a6a6",
"#737373",
"#000000",
"#404040",
"#404040",
"#404040",
"#404040",
"#404040",
"#404040",
"#404040",
"#404040",
"#404040",
"#404040",
"#404040",
"#404040",
"#404040",
"#404040",
"#404040"
],
"lastShownVersion": "3.3.4",
"rootFolderOrder": [],
"rootTagOrder": [],
"rootPropertyOrder": []
}
File diff suppressed because one or more lines are too long
+11
View File
@@ -0,0 +1,11 @@
{
"id": "notebook-navigator",
"name": "Notebook Navigator",
"version": "3.3.4",
"minAppVersion": "1.11.0",
"description": "Replace the default file explorer with a clean two-pane interface featuring folder tree, tag browsing, file previews, keyboard navigation, drag-and-drop, pinned notes, and customizable display options.",
"author": "Johan Sanneblad",
"authorUrl": "https://github.com/johansan",
"fundingUrl": "https://github.com/sponsors/johansan/",
"isDesktopOnly": false
}
File diff suppressed because it is too large Load Diff
+3 -3
View File
@@ -6,7 +6,7 @@
"autoSaveInterval": 20,
"autoPushInterval": 0,
"autoPullInterval": 0,
"autoPullOnBoot": false,
"autoPullOnBoot": true,
"autoCommitOnlyStaged": false,
"disablePush": false,
"pullBeforePush": true,
@@ -24,7 +24,7 @@
"refreshSourceControl": true,
"basePath": "",
"differentIntervalCommitAndPush": false,
"changedFilesInStatusBar": false,
"changedFilesInStatusBar": true,
"showedMobileNotice": true,
"refreshSourceControlTimer": 7000,
"showBranchStatusBar": true,
@@ -38,7 +38,7 @@
"hunks": {
"showSigns": false,
"hunkCommands": false,
"statusBar": "disabled"
"statusBar": "colored"
},
"lineAuthor": {
"show": false,
+11
View File
@@ -0,0 +1,11 @@
{
"port": 27124,
"insecurePort": 27123,
"enableInsecureServer": true,
"apiKey": "13bd2afd2c4c17f99211ea3d6ae52b53864439a0ffe5e2c3642ef7275ec9e455",
"crypto": {
"cert": "-----BEGIN CERTIFICATE-----\r\nMIIDRTCCAi2gAwIBAgIBATANBgkqhkiG9w0BAQsFADAiMSAwHgYDVQQDExdPYnNp\r\nZGlhbiBMb2NhbCBSRVNUIEFQSTAeFw0yNjA3MjgyMTMyMzVaFw0yNzA3MjgyMTMy\r\nMzVaMCIxIDAeBgNVBAMTF09ic2lkaWFuIExvY2FsIFJFU1QgQVBJMIIBIjANBgkq\r\nhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzkkBXQHRWKERtPc1I/eZ9K24UImbXyRQ\r\nM53wcLdmUJjel3zfxcUclh6ar326jPq2iUJ/3TCdbfVBbHkVVh93MlAeW051UH9H\r\nIcEckb4OJQRuSPkfrPrChV+oRH2lzzUWjSISASjKhD+AqhEpJF2pc+iM7RzByWB3\r\nMq1OLIutI9meuRt3ork0D3lFMrC7ZHVeWT4NlEUwWqKImhVDKDQqxGIRDsAAdm8F\r\nNdArKejWliElLddnXZ22Hr/J70zKtCFudDh4EotwKmnbXYfLAFdviqxU4oUBGDXD\r\nmF6Baldj8C98IXKYa7NoINQ2Fj29s9sLqW88vSMRXlqQbmhlJmOB/wIDAQABo4GF\r\nMIGCMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgLEMDsGA1UdJQQ0MDIG\r\nCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcD\r\nCDARBglghkgBhvhCAQEEBAMCAPcwDwYDVR0RBAgwBocEfwAAATANBgkqhkiG9w0B\r\nAQsFAAOCAQEAHe6A1nyR18unxh/RrZzQ0auUUoIyOZWU0PP4ItEkOOqY85HmiyDM\r\nHLym+HJK+gBJEqKt+MP6uPkVohqBGo/87RVSDZTMX7U1irWvtp3G9k1MM2x5ZZwG\r\nVZmAid7kxYe7iC1GJ2CMW3lK2/7bEilhc45BLuXCB96uvz+fQ/xRhrbCH4rtV4ft\r\nQyrEKF2koMss4S+voCgAW9c5gg7JimZe1GbVYjwxFIKx00Fyoldyo4zpdVALwTZO\r\nAA5JfcNtlWKPFa/Duu8uhSFgSww2Nkn0kPSAp2PCtkMjXVZFrbYIgAlhN3AO86Wn\r\nhldtaDoQgxJozaEg7mW89k44p/lYyXqoFQ==\r\n-----END CERTIFICATE-----\r\n",
"privateKey": "-----BEGIN RSA PRIVATE KEY-----\r\nMIIEowIBAAKCAQEAzkkBXQHRWKERtPc1I/eZ9K24UImbXyRQM53wcLdmUJjel3zf\r\nxcUclh6ar326jPq2iUJ/3TCdbfVBbHkVVh93MlAeW051UH9HIcEckb4OJQRuSPkf\r\nrPrChV+oRH2lzzUWjSISASjKhD+AqhEpJF2pc+iM7RzByWB3Mq1OLIutI9meuRt3\r\nork0D3lFMrC7ZHVeWT4NlEUwWqKImhVDKDQqxGIRDsAAdm8FNdArKejWliElLddn\r\nXZ22Hr/J70zKtCFudDh4EotwKmnbXYfLAFdviqxU4oUBGDXDmF6Baldj8C98IXKY\r\na7NoINQ2Fj29s9sLqW88vSMRXlqQbmhlJmOB/wIDAQABAoIBADVa7q5WxQYOixzq\r\nf+UwqrJ9qFm0bep64v+mz0ToOt+H2rMGCn8Fz7IIcmwHshO62THBcH8Ojvmc4PIk\r\nk182PkdWL7PgJDnQ4d4aK8CKjvAGKFxZi1bbeSq0Jjqo4RUqHw4cDNod6duw7R+P\r\n1rtgOm8PbDv8Hydt+waxirG84uiNby4WlV9Os7j9t6+n8mQAh4ahzSUzfxWEwsz5\r\n258TprfuO2pmL3NEny0leiT8N8GkhVCzuufORMkjuQPgyVjHBz9bzWaMWHomHS8X\r\nXUjnwhePp7Wk9vzNm0UnV9knkqSNdHHR0GO8iDFvfoAhGxg7qn4r/7XMD6+wZyN+\r\n272gEQECgYEA7YmqF3PJ+OjaqXOW3XeQSYYU22Byt3es2088wUentYNMBdSwcuxo\r\nAtJX36VcMtX/idbu7p1lfghb3cj3tfS2KciRuPSYjYVAdzPMOWFvGYjtb8vLJyC4\r\nKsF3tJ84CA4jZ0FeRs7Yf8eV5+1IgywOf5JwAEkH7onOh1cPDq37Zn8CgYEA3lGA\r\nk6s9qDmFZG+fdixH17+dEJHHgOu4rHc4uwKlShU6yFvw/O1iekJqhGqc+B1HRc+9\r\nyINuFIujJ1eGEdbtftbEj+6Tls8L86W61pbP4qKW7hH1Y/Xhe566BX7J8WyzT1j0\r\nZ4SWOSGvwVI1WY+I9+ST82gSqAWNhKUlIBg1JIECgYBD5b7N11YbJQwjtZuhEGUY\r\n7w+VKXuA/99UDNEz+jRxCOe5HvOU1ghhDhj6H308NrlFgD9py2nQXblMqv5Lb3iG\r\ndwNYV+onQbiMmiy9FiG4rdAYzarzM0IRTp3V7lEI1GnAQQoeuU9fLwCle8jnXbeD\r\nNat4GWgAAjobq4HtU0PyJwKBgHW/pyEPRnXOGXeLo2K8q0R7CV5YR9lhgAtgjdyG\r\n1zK4scyi3a2osUrd2HrP2NmU8EXqdLM54VjiaISS18ClHF7cs3kkPGlYuhTPB3lW\r\noT6BLP1k55qNBWMrO41jjOPg1cvF6pTVZZdW3za+KuGHo1zgZPg7e/4gCsdhjJtG\r\nFweBAoGBAMfdxrmJ9GlLQ1weCgVpysnXTy/kw8w49l8SfhgPPTdlGfwcOLVUmOC5\r\nRRuhlSh/fappY+xH0OCnO0dtGyn4k1rV7GAax2YyKptL07mUpcD/ZAWLP6hqS2XX\r\na+M/FundMcjXMrP1hIkOMdNVvWzE91534uuxWwgCmc9QcE4cwc4o\r\n-----END RSA PRIVATE KEY-----\r\n",
"publicKey": "-----BEGIN PUBLIC KEY-----\r\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzkkBXQHRWKERtPc1I/eZ\r\n9K24UImbXyRQM53wcLdmUJjel3zfxcUclh6ar326jPq2iUJ/3TCdbfVBbHkVVh93\r\nMlAeW051UH9HIcEckb4OJQRuSPkfrPrChV+oRH2lzzUWjSISASjKhD+AqhEpJF2p\r\nc+iM7RzByWB3Mq1OLIutI9meuRt3ork0D3lFMrC7ZHVeWT4NlEUwWqKImhVDKDQq\r\nxGIRDsAAdm8FNdArKejWliElLddnXZ22Hr/J70zKtCFudDh4EotwKmnbXYfLAFdv\r\niqxU4oUBGDXDmF6Baldj8C98IXKYa7NoINQ2Fj29s9sLqW88vSMRXlqQbmhlJmOB\r\n/wIDAQAB\r\n-----END PUBLIC KEY-----\r\n"
}
}
File diff suppressed because one or more lines are too long
+10
View File
@@ -0,0 +1,10 @@
{
"id": "obsidian-local-rest-api",
"name": "Local REST API with MCP",
"version": "5.0.2",
"minAppVersion": "1.8.7",
"description": "A secure REST API and Model Context Protocol (MCP) server for your vault.",
"author": "Adam Coddington",
"authorUrl": "https://adamcoddington.net/",
"isDesktopOnly": true
}
+55
View File
@@ -0,0 +1,55 @@
/* Sets all the text color to red! */
div.obsidian-local-rest-api-settings div.api-key-display {
margin-bottom: 20px;
}
div.obsidian-local-rest-api-settings pre {
font-size: 0.8em;
padding: 10px 20px;
margin: 10px 25px;
background-color: var(--background-modifier-cover);
font-family: monospace;
user-select: all;
}
div.obsidian-local-rest-api-settings div.setting-item-control {
min-width: 50%;
}
div.obsidian-local-rest-api-settings textarea {
width: 100%;
}
div.obsidian-local-rest-api-settings div.certificate-expired {
padding: 10px 20px;
border: 2px solid #ff0000;
}
div.obsidian-local-rest-api-settings div.certificate-expiring-soon {
padding: 10px 20px;
border: 2px solid #ffff00;
}
div.obsidian-local-rest-api-settings div.certificate-regeneration-recommended {
padding: 10px 20px;
border: 2px solid #ffff00;
}
div.obsidian-local-rest-api-settings table.api-urls tr {
width: 100%;
}
div.obsidian-local-rest-api-settings table.api-urls th,
div.obsidian-local-rest-api-settings table.api-urls td {
padding: 5px 25px;
}
div.obsidian-local-rest-api-settings table.api-urls tr.disabled td.name,
div.obsidian-local-rest-api-settings table.api-urls tr.disabled td.url {
text-decoration: line-through;
}
div.obsidian-local-rest-api-settings p {
padding: 0px 15px;
}
-512
View File
@@ -1,512 +0,0 @@
/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
var __export = (target, all) => {
__markAsModule(target);
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __reExport = (target, module2, desc) => {
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
for (let key of __getOwnPropNames(module2))
if (!__hasOwnProp.call(target, key) && key !== "default")
__defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
}
return target;
};
var __toModule = (module2) => {
return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
};
var __publicField = (obj, key, value) => {
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
return value;
};
// src/main.ts
__export(exports, {
default: () => SettingsSearch
});
var import_obsidian = __toModule(require("obsidian"));
// node_modules/monkey-around/mjs/index.js
function around(obj, factories) {
const removers = Object.keys(factories).map((key) => around1(obj, key, factories[key]));
return removers.length === 1 ? removers[0] : function() {
removers.forEach((r) => r());
};
}
function around1(obj, method, createWrapper) {
const original = obj[method], hadOwn = obj.hasOwnProperty(method);
let current = createWrapper(original);
if (original)
Object.setPrototypeOf(current, original);
Object.setPrototypeOf(wrapper, current);
obj[method] = wrapper;
return remove;
function wrapper(...args) {
if (current === original && obj[method] === wrapper)
remove();
return current.apply(this, args);
}
function remove() {
if (obj[method] === wrapper) {
if (hadOwn)
obj[method] = original;
else
delete obj[method];
}
if (current === original)
return;
current = original;
Object.setPrototypeOf(wrapper, original || Function);
}
}
// src/main.ts
var SettingsSearch = class extends import_obsidian.Plugin {
constructor() {
super(...arguments);
__publicField(this, "settingsSearchEl", createDiv("settings-search-container vertical-tab-header-group"));
__publicField(this, "settingsResultsContainerEl", createDiv("settings-search-results-container vertical-tab-content"));
__publicField(this, "settingsNavItemContainer", this.settingsSearchEl.createDiv("vertical-tab-header-group-items").createDiv("vertical-tab-nav-item settings-search-input"));
__publicField(this, "settingsResultsEl");
__publicField(this, "search");
__publicField(this, "locale");
__publicField(this, "resources", []);
__publicField(this, "results", []);
__publicField(this, "loaded", false);
__publicField(this, "tabIndex", 0);
__publicField(this, "pluginTabIndex", 0);
__publicField(this, "seen", []);
__publicField(this, "settingCache", new Map());
__publicField(this, "searchAppended", false);
__publicField(this, "activeIndex", -1);
__publicField(this, "activeSetting");
__publicField(this, "scope", new import_obsidian.Scope(this.app.scope));
__publicField(this, "mobileContainers", []);
}
async onload() {
(window["SettingsSearch"] = {
addResources: this.addResources.bind(this),
removeResources: this.removeResources.bind(this),
removeTabResources: this.removeTabResources.bind(this)
}) && this.register(() => delete window["SettingsSearch"]);
this.app.workspace.onLayoutReady(async () => {
this.settingsResultsContainerEl.createEl("h3", {
text: "Settings Search Results"
});
this.settingsResultsEl = this.settingsResultsContainerEl.createDiv("settings-search-results");
this.buildScope();
this.buildSearch();
this.buildResources();
this.buildPluginResources();
this.patchSettings();
this.loaded = true;
this.app.workspace.trigger("settings-search-loaded");
});
}
buildResources() {
const tab = this.app.setting.settingTabs[this.tabIndex];
if (tab && tab.id !== void 0 && !this.seen.includes(tab.id)) {
this.getTabResources(tab);
this.tabIndex++;
setTimeout(() => this.buildResources());
}
}
buildPluginResources() {
const tab = this.app.setting.pluginTabs[this.pluginTabIndex];
if (tab) {
this.getTabResources(tab);
this.pluginTabIndex++;
setTimeout(() => this.buildPluginResources());
}
}
get manifests() {
return Object.values(this.app.plugins.manifests);
}
addResourceToCache(resource) {
if (!resource || !resource.text || !resource.name || !resource.tab) {
return new Error("A valid resource must be provided.");
}
let name;
if (resource.external) {
name = createFragment((el) => {
(0, import_obsidian.setIcon)(el.createSpan({
attr: {
"aria-label": "This setting was added by another plugin."
}
}), "info");
el.createSpan({ text: resource.text });
});
} else {
name = resource.text;
}
const setting = new import_obsidian.Setting(createDiv()).setName(name).setDesc(createFragment((e) => e.createDiv().innerHTML = resource.desc ?? ""));
if (resource.external) {
setting.settingEl.addClass("set-externally");
}
if (resource.tab == "community-plugins") {
let plugin = this.manifests.find((p) => p.name == resource.text);
if (plugin && this.app.plugins.getPlugin(plugin.id)?._loaded && this.app.setting.pluginTabs.find((t) => t.id == plugin.id)) {
setting.addExtraButton((b) => {
b.setTooltip(`Open ${resource.text} Settings`).onClick(() => {
this.app.setting.openTabById(plugin.id);
});
});
}
}
if (resource.tab == "plugins") {
const plugins = Object.values(this.app.internalPlugins.plugins);
const plugin = plugins.find((p) => p._loaded && p.instance.name == resource.text);
if (plugin && this.app.setting.pluginTabs.find((t) => t.id == plugin.instance.id)) {
setting.addExtraButton((b) => {
b.setTooltip(`Open ${resource.text} Settings`).onClick(() => {
this.app.setting.openTabById(plugin.instance.id);
});
});
}
}
setting.addExtraButton((b) => {
b.setIcon("forward-arrow").onClick(() => {
this.showResult(resource);
});
});
this.settingCache.set(resource, setting);
}
getResourceFromCache(resource) {
if (!this.settingCache.has(resource)) {
this.addResourceToCache(resource);
}
return this.settingCache.get(resource);
}
removeResourcesFromCache(resources) {
for (const resource of resources) {
this.settingCache.delete(resource);
}
}
addResources(...resources) {
for (const resource of resources) {
resource.external = true;
if (this.resources.find((k) => this.equivalent(resource, k)))
continue;
this.resources.push(resource);
this.addResourceToCache(resource);
}
return () => this.removeResources(...resources);
}
equivalent(resource1, resource2) {
return resource1.name == resource2.name && resource1.tab == resource2.tab && resource1.text == resource2.text && resource1.desc == resource2.desc && resource1.external == resource2.external;
}
removeResources(...resources) {
const removing = [];
const keys = [...this.settingCache.keys()];
for (const resource of resources) {
if (!resource || !resource.text || !resource.name || !resource.tab) {
continue;
}
resource.external = true;
this.resources = this.resources.filter((r) => !this.equivalent(resource, r));
removing.push(...keys.filter((k) => k == resource || this.equivalent(resource, k)));
}
this.removeResourcesFromCache(removing);
}
removeTabResources(tab) {
const removing = this.resources.filter((t) => t.tab == tab);
this.resources = this.resources.filter((t) => t.tab != tab);
this.removeResourcesFromCache(removing);
}
async getTabResources(tab) {
await tab.display();
const settings = tab.containerEl.querySelectorAll(".setting-item:not(.setting-item-header)");
for (const el of Array.from(settings)) {
const text = el.querySelector(".setting-item-name")?.textContent;
if (!text)
continue;
const desc = el.querySelector(".setting-item-description")?.innerHTML ?? "";
const resource = {
tab: tab.id,
name: tab.name,
text,
desc
};
this.resources.push(resource);
this.addResourceToCache(resource);
}
if (this.app.setting.activeTab?.id == tab.id)
return;
this.seen.push(tab.id);
tab.containerEl.detach();
tab.hide();
}
patchSettings() {
const self = this;
this.register(around(this.app.setting, {
onOpen: function(next) {
return function() {
next.apply(this);
if (!import_obsidian.Platform.isMobile)
self.search.inputEl.focus();
return next;
};
}
}));
this.register(around(this.app.setting, {
addSettingTab: function(next) {
return function(tab) {
if (tab && tab.id !== void 0 && !self.seen.includes(tab.id)) {
self.getTabResources(tab);
}
return next.call(this, tab);
};
}
}));
this.register(around(this.app.setting, {
removeSettingTab: function(next) {
return function(tab) {
if (this.isPluginSettingTab(tab)) {
self.removeTabResources(tab.id);
}
return next.call(this, tab);
};
}
}));
this.register(around(this.app.setting, {
openTab: function(next) {
return function(tab) {
self.searchAppended = false;
self.app.keymap.popScope(self.scope);
return next.call(this, tab);
};
},
openTabById: function(next) {
return function(tab) {
self.searchAppended = false;
self.app.keymap.popScope(self.scope);
return next.call(this, tab);
};
},
onClose: function(next) {
return function() {
if (import_obsidian.Platform.isMobile) {
self.detach();
}
return next.call(this);
};
}
}));
}
buildSearch() {
const tempSetting = new import_obsidian.Setting(createDiv()).addSearch((s) => {
this.search = s;
});
this.settingsNavItemContainer.append(tempSetting.controlEl);
tempSetting.settingEl.detach();
this.search.onChange((v) => {
this.onChange(v);
});
this.search.setPlaceholder("Search settings...");
this.app.setting.tabHeadersEl.prepend(this.settingsSearchEl);
}
buildScope() {
this.scope.register(["Ctrl"], "N", () => {
if (this.activeSetting) {
this.activeSetting.settingEl.removeClass("active");
}
this.activeIndex = ((this.activeIndex + 1) % this.results.length + this.results.length) % this.results.length;
this.centerActiveSetting();
});
this.scope.register([], "ArrowDown", () => {
if (this.activeSetting) {
this.activeSetting.settingEl.removeClass("active");
}
this.activeIndex = ((this.activeIndex + 1) % this.results.length + this.results.length) % this.results.length;
this.centerActiveSetting();
});
this.scope.register(["Ctrl"], "P", () => {
if (this.activeSetting) {
this.activeSetting.settingEl.removeClass("active");
}
this.activeIndex = ((this.activeIndex - 1) % this.results.length + this.results.length) % this.results.length;
this.centerActiveSetting();
});
this.scope.register([], "ArrowUp", () => {
if (this.activeSetting) {
this.activeSetting.settingEl.removeClass("active");
}
this.activeIndex = ((this.activeIndex - 1) % this.results.length + this.results.length) % this.results.length;
this.centerActiveSetting();
});
this.scope.register([], "Enter", () => {
if (this.activeSetting) {
this.showResult(this.results[this.activeIndex]);
}
});
}
centerActiveSetting() {
const result = this.results[this.activeIndex];
this.activeSetting = this.getResourceFromCache(result);
this.activeSetting.settingEl.addClass("active");
this.activeSetting.settingEl.scrollIntoView({
behavior: "auto",
block: "nearest"
});
}
detachFromMobile() {
if (import_obsidian.Platform.isMobile) {
this.settingsResultsContainerEl.detach();
for (const header of this.mobileContainers) {
this.app.setting.tabHeadersEl.append(header);
}
this.search.setValue("");
}
}
detachFromDesktop() {
if (import_obsidian.Platform.isDesktop) {
this.app.setting.openTabById(this.app.setting.lastTabId);
}
}
detach() {
this.detachFromDesktop();
this.detachFromMobile();
this.searchAppended = false;
}
onChange(v) {
if (!v) {
this.detach();
this.app.keymap.popScope(this.scope);
return;
}
if (!this.searchAppended) {
this.activeIndex = -1;
this.app.keymap.popScope(this.scope);
this.app.keymap.pushScope(this.scope);
if (this.activeSetting) {
this.activeSetting.settingEl.removeClass("active");
this.activeSetting = null;
}
if (!import_obsidian.Platform.isMobile) {
this.app.setting.activeTab.navEl.removeClass("is-active");
this.app.setting.tabContentContainer.empty();
this.app.setting.tabContentContainer.append(this.settingsResultsContainerEl);
} else {
const headers = this.app.setting.tabHeadersEl.querySelectorAll(".vertical-tab-header-group:not(.settings-search-container)");
for (const header of Array.from(headers)) {
this.mobileContainers.push(header);
header.detach();
}
this.app.setting.tabHeadersEl.append(this.settingsResultsContainerEl);
}
this.searchAppended = true;
}
this.appendResults(this.performFuzzySearch(v));
}
getMatchText(text, result) {
const matchElements = {};
return createFragment((content) => {
for (let i = 0; i < text.length; i++) {
let match = result.matches.find((m) => m[0] === i);
if (match) {
const index = result.matches.indexOf(match);
if (!matchElements[index]) {
matchElements[index] = createSpan("suggestion-highlight");
}
let element = matchElements[index];
content.appendChild(element);
element.appendText(text.substring(match[0], match[1]));
i += match[1] - match[0] - 1;
continue;
}
content.appendText(text[i]);
}
});
}
appendResults(results) {
this.settingsResultsEl.empty();
if (results.length) {
const headers = {};
for (const resource of results) {
if (!(resource.tab in headers)) {
headers[resource.tab] = this.settingsResultsEl.createDiv();
new import_obsidian.Setting(headers[resource.tab]).setHeading().setName(resource.name);
}
const setting = this.getResourceFromCache(resource);
headers[resource.tab].append(setting.settingEl);
}
} else {
this.settingsResultsEl.setText("No results found :(");
}
}
showResult(result) {
this.search.setValue("");
const tab = this.app.setting.settingTabs.find((t) => t.id == result.tab) ?? this.app.setting.pluginTabs.find((t) => t.id == result.tab);
if (!tab) {
new import_obsidian.Notice("There was an issue opening the setting tab.");
return;
}
this.app.setting.openTabById(tab.id);
this.app.keymap.popScope(this.scope);
this.detach();
try {
const names = tab.containerEl.querySelectorAll(".setting-item-name");
const el = Array.from(names).find((n) => n.textContent == result.text);
if (!el)
return;
const setting = el.closest(".setting-item");
if (!setting)
return;
if (tab.id == "obsidian-style-settings") {
let collapsed = setting.closest(".style-settings-container");
let previous = collapsed?.previousElementSibling;
while (previous != null && previous.hasClass("is-collapsed") && previous.hasClass("style-settings-heading")) {
previous.removeClass("is-collapsed");
collapsed = collapsed.parentElement?.closest(".style-settings-container");
previous = collapsed?.previousElementSibling;
}
}
let details = setting.closest("details");
while (details) {
details.setAttr("open", "open");
details = details.parentElement?.closest("details");
}
setting.scrollIntoView(true);
setting.addClass("is-flashing");
window.setTimeout(() => setting.removeClass("is-flashing"), 3e3);
} catch (e) {
console.error(e);
}
}
performFuzzySearch(input) {
const results = [], hotkeys = [];
for (const resource of this.resources) {
let result = (0, import_obsidian.prepareSimpleSearch)(input)(resource.text) ?? (0, import_obsidian.prepareSimpleSearch)(input)(resource.desc);
if (result) {
if (resource.tab == "hotkeys") {
hotkeys.push(resource);
} else {
results.push(resource);
}
}
}
this.results = [...results, ...hotkeys];
return this.results;
}
onunload() {
this.settingsSearchEl.detach();
this.settingsResultsEl.detach();
this.detach();
if (this.searchAppended && import_obsidian.Platform.isDesktop)
this.app.setting.openTabById(this.app.setting.lastTabId);
}
};
/* nosourcemap */
-10
View File
@@ -1,10 +0,0 @@
{
"id": "settings-search",
"name": "Settings Search",
"version": "1.3.10",
"minAppVersion": "0.12.17",
"author": "Jeremy Valentine",
"description": "Globally search settings in Obsidian.md",
"authorUrl": "https://github.com/valentine195",
"isDesktopOnly": false
}
-25
View File
@@ -1,25 +0,0 @@
/* src/assets/main.css */
.settings-search-container.vertical-tab-header-group {
padding-bottom: 0;
}
.settings-search-input {
padding-left: 6px;
}
.vertical-tab-nav-item.settings-search-input {
background-color: inherit !important;
}
.settings-search-input .setting-item-control {
display: block;
}
.settings-search-input .search-input-container {
margin: 0;
}
.settings-search-results .setting-item.active {
background-color: var(--background-secondary);
}
.settings-search-results .set-externally .setting-item-name {
display: flex;
gap: 0.5rem;
}
/* src/styles.css */
+4
View File
@@ -0,0 +1,4 @@
{
"installed_at": 1787518597375,
"last_version": "4.7.2"
}
File diff suppressed because one or more lines are too long
+10
View File
@@ -0,0 +1,10 @@
{
"id": "smart-connections",
"name": "Smart Connections",
"author": "Brian Petro",
"description": "AI link discovery copilot. See related notes as you write. Lookup using semantic (vector) search across your vault. Zero-setup local model for embeddings, no API keys, private.",
"minAppVersion": "1.8.7",
"authorUrl": "https://smartconnections.app",
"isDesktopOnly": false,
"version": "4.7.2"
}
File diff suppressed because it is too large Load Diff
+3
View File
@@ -0,0 +1,3 @@
{
"last_version": "0.3.4"
}
File diff suppressed because one or more lines are too long
+10
View File
@@ -0,0 +1,10 @@
{
"id": "smart-lookup",
"name": "Smart Lookup",
"author": "Brian Petro",
"description": "Semantic search for your vault. Ask in natural language, find notes by meaning when exact words fail, preview matching notes, and turn forgotten ideas into links, context, and next steps.",
"minAppVersion": "1.8.7",
"authorUrl": "https://smartconnections.app",
"isDesktopOnly": false,
"version": "0.3.4"
}
File diff suppressed because it is too large Load Diff
+56
View File
@@ -0,0 +1,56 @@
{
"data_version": 2,
"command_timeout": 5,
"templates_folder": "10 Knowledge/Templates",
"templates_pairs": [],
"trigger_on_file_creation_mode": "folder",
"auto_jump_to_cursor": true,
"jump_to_cursor_after_file_name": false,
"shell_path": "",
"user_scripts_folder": "",
"folder_templates": [
{
"folder": "20 Work/Journal/2026",
"template": "10 Knowledge/Templates/Journal Template.md"
},
{
"folder": "20 Work/Weekly Review/2026",
"template": "10 Knowledge/Templates/Weekly Review Template.md"
},
{
"folder": "20 Work/Decisions/2026",
"template": "10 Knowledge/Templates/Decision Template.md"
},
{
"folder": "20 Work/Decisions",
"template": "10 Knowledge/Templates/Decision Template.md"
},
{
"folder": "20 Work/Journal",
"template": "10 Knowledge/Templates/Journal Template.md"
},
{
"folder": "20 Work/Weekly Review",
"template": "10 Knowledge/Templates/Weekly Review Template.md"
},
{
"folder": "20 Work/Contracts",
"template": "10 Knowledge/Templates/Contract Template.md"
},
{
"folder": "20 Work/Ideas",
"template": "idea"
},
{
"folder": "20 Work/Tracking",
"template": "10 Knowledge/Templates/Jira incident template.md"
}
],
"file_templates": [],
"syntax_highlighting": true,
"syntax_highlighting_mobile": false,
"enabled_templates_hotkeys": [],
"startup_templates": [],
"intellisense_render": "1",
"ignore_folders_on_creation": []
}
File diff suppressed because one or more lines are too long
+17
View File
@@ -0,0 +1,17 @@
{
"id": "templater-obsidian",
"name": "Templater",
"version": "2.25.0",
"description": "Advanced templating and automation using handlebars-like syntax.",
"minAppVersion": "1.13.0",
"author": "SilentVoid",
"authorUrl": "https://github.com/SilentVoid13",
"fundingUrl": {
"GitHub Sponser (Zachatoo, maintainer)": "https://github.com/sponsors/Zachatoo",
"Ko-fi (Zachatoo, maintainer)": "https://ko-fi.com/zachatoo",
"GitHub Sponser (SilentVoid13, creator)": "https://github.com/sponsors/SilentVoid13",
"Paypal (SilentVoid13, creator)": "https://www.paypal.com/donate?hosted_button_id=U2SRGAFYXT32Q"
},
"helpUrl": "https://silentvoid13.github.io/Templater/",
"isDesktopOnly": false
}
+170
View File
@@ -0,0 +1,170 @@
.templater-prompt-div,
.templater-multisuggester-div {
display: flex;
}
.templater-prompt-input,
.templater-multisuggester-input {
flex-grow: 1;
}
.templater-button-div {
display: flex;
flex-direction: column;
align-items: center;
margin-top: 1rem;
}
textarea.templater-prompt-input {
height: 10rem;
}
.templater-ignore-folder-modal .modal-content input[type="text"],
.templater-startup-template-modal .modal-content input[type="text"] {
width: 100%;
}
textarea.templater-prompt-input:focus {
border-color: var(--interactive-accent);
}
.templater-multisuggester-list {
margin: 1.5em 0;
}
.cm-s-obsidian .templater-command-bg {
left: 0px;
right: 0px;
background-color: var(--background-primary-alt);
}
.cm-s-obsidian .cm-templater-command {
font-size: 0.85em;
font-family: var(--font-monospace);
line-height: 1.3;
}
.cm-s-obsidian .templater-inline .cm-templater-command {
background-color: var(--background-primary-alt);
}
.cm-s-obsidian .cm-templater-command.cm-templater-opening-tag {
font-weight: bold;
}
.cm-s-obsidian .cm-templater-command.cm-templater-closing-tag {
font-weight: bold;
}
.cm-s-obsidian .cm-templater-command.cm-templater-interpolation-tag {
color: var(--code-property, #008bff);
}
.cm-s-obsidian .cm-templater-command.cm-templater-execution-tag {
color: var(--code-function, #c0d700);
}
.cm-s-obsidian .cm-templater-command.cm-keyword {
color: var(--code-keyword, #00a7aa);
font-weight: normal;
}
.cm-s-obsidian .cm-templater-command.cm-atom {
color: var(--code-normal, #f39b35);
}
.cm-s-obsidian .cm-templater-command.cm-value,
.cm-s-obsidian .cm-templater-command.cm-number,
.cm-s-obsidian .cm-templater-command.cm-type {
color: var(--code-value, #a06fca);
}
.cm-s-obsidian .cm-templater-command.cm-def,
.cm-s-obsidian .cm-templater-command.cm-type.cm-def {
color: var(--code-normal, var(--text-normal));
}
.cm-s-obsidian .cm-templater-command.cm-property,
.cm-s-obsidian .cm-templater-command.cm-property.cm-def,
.cm-s-obsidian .cm-templater-command.cm-attribute {
color: var(--code-function, #98e342);
}
.cm-s-obsidian .cm-templater-command.cm-variable,
.cm-s-obsidian .cm-templater-command.cm-variable-2,
.cm-s-obsidian .cm-templater-command.cm-variable-3,
.cm-s-obsidian .cm-templater-command.cm-meta {
color: var(--code-property, #d4d4d4);
}
.cm-s-obsidian .cm-templater-command.cm-callee,
.cm-s-obsidian .cm-templater-command.cm-operator,
.cm-s-obsidian .cm-templater-command.cm-qualifier,
.cm-s-obsidian .cm-templater-command.cm-builtin {
color: var(--code-operator, #fc4384);
}
.cm-s-obsidian .cm-templater-command.cm-tag {
color: var(--code-tag, #fc4384);
}
.cm-s-obsidian .cm-templater-command.cm-comment,
.cm-s-obsidian .cm-templater-command.cm-comment.cm-tag,
.cm-s-obsidian .cm-templater-command.cm-comment.cm-attribute {
color: var(--code-comment, #696d70);
}
.cm-s-obsidian .cm-templater-command.cm-string,
.cm-s-obsidian .cm-templater-command.cm-string-2 {
color: var(--code-string, #e6db74);
}
.cm-s-obsidian .cm-templater-command.cm-header,
.cm-s-obsidian .cm-templater-command.cm-hr {
color: var(--code-keyword, #da7dae);
}
.cm-s-obsidian .cm-templater-command.cm-link {
color: var(--code-normal, #696d70);
}
.cm-s-obsidian .cm-templater-command.cm-error {
border-bottom: 1px solid #c42412;
}
.CodeMirror-hints {
position: absolute;
z-index: 10;
overflow: hidden;
list-style: none;
margin: 0;
padding: 2px;
-webkit-box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);
-moz-box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);
box-shadow: 2px 3px 5px rgba(0, 0, 0, 0.2);
border-radius: 3px;
border: 1px solid silver;
background: white;
font-size: 90%;
font-family: monospace;
max-height: 20em;
overflow-y: auto;
}
.CodeMirror-hint {
margin: 0;
padding: 0 4px;
border-radius: 2px;
white-space: pre;
color: black;
cursor: pointer;
}
li.CodeMirror-hint-active {
background: #0088ff;
color: white;
}
+15
View File
@@ -0,0 +1,15 @@
{
"types": {
"aliases": "aliases",
"cssclasses": "multitext",
"tags": "tags",
"renewal_date": "date",
"contract_end": "date",
"category": "multitext",
"projects": "multitext",
"date": "date",
"contract_start": "date",
"renewal_status": "multitext",
"auto_renewal": "checkbox"
}
}
+223
View File
@@ -0,0 +1,223 @@
{
"main": {
"id": "f02c62e9dd362172",
"type": "split",
"children": [
{
"id": "abf3ba7e57cbc170",
"type": "tabs",
"children": [
{
"id": "b5344eceadba0fc2",
"type": "leaf",
"state": {
"type": "empty",
"state": {},
"icon": "lucide-file",
"title": "New tab"
}
}
]
}
],
"direction": "vertical"
},
"left": {
"id": "34574b27c2a3fa3d",
"type": "mobile-drawer",
"children": [
{
"id": "870e67f3c01edcff",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": false,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-folder-closed",
"title": "Files"
}
},
{
"id": "382a019153039622",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
},
"icon": "lucide-search",
"title": "Search"
}
},
{
"id": "865631e7a597ae19",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-tags",
"title": "Tags"
}
},
{
"id": "8f49abdd8de7ec33",
"type": "leaf",
"state": {
"type": "all-properties",
"state": {
"sortOrder": "frequency",
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-archive",
"title": "All properties"
}
},
{
"id": "70dc63ec67fbc4ce",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-bookmark",
"title": "Bookmarks"
}
}
],
"currentTab": 0
},
"right": {
"id": "6c3727b928dec85c",
"type": "mobile-drawer",
"children": [
{
"id": "0744fa636b42bd63",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"file": "quotes/Quotes.md",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
"showSearch": false,
"searchQuery": "",
"backlinkCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
"title": "Backlinks"
}
},
{
"id": "8b243870131b0efb",
"type": "leaf",
"state": {
"type": "outgoing-link",
"state": {
"linksCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
"title": "Outgoing links"
}
},
{
"id": "5a1e3406ec37404e",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"followCursor": false,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-list",
"title": "Outline"
}
},
{
"id": "0dfb780ad8f31552",
"type": "leaf",
"state": {
"type": "notebook-navigator-calendar",
"state": {},
"icon": "lucide-calendar-days",
"title": "Calendar"
}
}
],
"currentTab": 0
},
"left-ribbon": {
"hiddenItems": {
"switcher:Open quick switcher": false,
"graph:Open graph view": false,
"canvas:Create new canvas": false,
"daily-notes:Open today's daily note": false,
"templates:Insert template": false,
"command-palette:Open command palette": false,
"bases:Create new base": false,
"iconic:Open rulebook": false,
"omnisearch:Omnisearch": false,
"notebook-navigator:Notebook Navigator": false,
"templater-obsidian:Templater": false
}
},
"active": "b5344eceadba0fc2",
"lastOpenFiles": [
"meetmic/treated/Toute une semaine - Le flux de publication.md",
"meetmic/treated/Recording 2026-08-21 at 08.37.39 AM.md",
"meetmic/treated/Recording 2026-08-17 at 09.48.40 AM.md",
"meetmic/treated/Hajar - Amadou.md",
"meetmic/treated/Flux - Live ONFR.md",
"meetmic/treated/Discussion CI-CD.md",
"meetmic/treated/Boukili PROD- Alignement infra et déploiement du replicat.md",
"meetmic/treated/Boukili - Choix de la direction visuelle pour la phase 2.md",
"meetmic/treated/Accès Important - Meta et gestion des médias sociaux.md",
"meetmic/treated/[PNUM] Daily Scrum.md",
"meetmic/Recording 2026-08-21 at 12.41.45 PM.md",
"meetmic/Recording 2026-08-21 at 12.40.35 PM.md",
"meetmic/Recording 2026-08-21 at 04.38.28 PM.md",
"meetmic/Recording 2026-08-21 at 03.49.49 PM.md",
"Bootstrap script for this vault.md",
"30 Personal Projects/AI/CareerOp/Setup.md",
"30 Personal Projects/AI/CareerOp",
"30 Personal Projects/AI",
"20 Work/Tracking/Website Sync/Website Sync - Complaint Tracking.md",
"20 Work/Tracking/Website Sync/2026/08/2026-08-19 - TECH-32615.md",
"20 Work/Tracking/Website Sync/2026/08/2026-08-19 - TECH-32612.md",
"20 Work/Tracking/Website Sync/2026/08/2026-08-11 - TECH-32582.md",
"20 Work/Tracking/Website Sync/2026/08/2026-08-05 - TECH-32552.md",
"20 Work/Tracking/Website Sync/2026/08",
"20 Work/Tracking/Website Sync/2026/07/2026-07-24 - TECH-32507.md",
"20 Work/Tracking/Website Sync/2026/07/2026-07-15 - TECH-32453.md",
"20 Work/Tracking/Website Sync/2026/07/2026-07-06 - TECH-32396.md",
"20 Work/Tracking/Website Sync/2026/07",
"20 Work/Tracking/Website Sync/2026",
"20 Work/Tracking/Website Sync",
"20 Work/Tracking",
"20 Work/Team/Hajar/Hajar 1-1/Recordings/2026-08-17 - Hajar - Amadou.md",
"20 Work/Team/Hajar/Hajar 1-1/Recordings",
"20 Work/Team/Hajar/Hajar 1-1/2026-08-17 - Hajar 1-1.md",
"20 Work/Projects/2026/ONFR",
"20 Work/Projects/2026/Mogador Sync"
]
}
-238
View File
@@ -1,238 +0,0 @@
{
"main": {
"id": "ea9605a2a68c45b2",
"type": "split",
"children": [
{
"id": "be235ae05405f804",
"type": "tabs",
"children": [
{
"id": "579a503273b0c5ec",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "20 Work/Ideas/# Organizational Data & Analytics Operating Model.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "# Organizational Data & Analytics Operating Model"
}
}
]
}
],
"direction": "vertical"
},
"left": {
"id": "8a67c530ffad3fa1",
"type": "split",
"children": [
{
"id": "30e63f847d8e0030",
"type": "tabs",
"children": [
{
"id": "92c89fdf4eb1874e",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": false
},
"icon": "lucide-folder-closed",
"title": "Files"
}
},
{
"id": "9ad358656d81e680",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
},
"icon": "lucide-search",
"title": "Search"
}
},
{
"id": "c4294888cbe6493b",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {},
"icon": "lucide-bookmark",
"title": "Bookmarks"
}
}
]
}
],
"direction": "horizontal",
"width": 402.5
},
"right": {
"id": "d9252c3a3a14343a",
"type": "split",
"children": [
{
"id": "780f61722f9feb55",
"type": "tabs",
"children": [
{
"id": "22cb2abf8152a483",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"file": "Welcome.md",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
"showSearch": false,
"searchQuery": "",
"backlinkCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
"title": "Backlinks for Welcome"
}
},
{
"id": "eed50185012777ec",
"type": "leaf",
"state": {
"type": "outgoing-link",
"state": {
"file": "Welcome.md",
"linksCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
"title": "Outgoing links from Welcome"
}
},
{
"id": "cc88afc00e83d70b",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-tags",
"title": "Tags"
}
},
{
"id": "d8fd310b4e97efa6",
"type": "leaf",
"state": {
"type": "all-properties",
"state": {
"sortOrder": "frequency",
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-archive",
"title": "All properties"
}
},
{
"id": "ecaa2c55dbe6b1f0",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"file": "Welcome.md",
"followCursor": false,
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-list",
"title": "Outline of Welcome"
}
},
{
"id": "af92fb76fea9c73a",
"type": "leaf",
"state": {
"type": "git-view",
"state": {},
"icon": "git-pull-request",
"title": "Source Control"
}
}
],
"currentTab": 5
}
],
"direction": "horizontal",
"width": 300
},
"left-ribbon": {
"hiddenItems": {
"switcher:Open quick switcher": false,
"graph:Open graph view": false,
"canvas:Create new canvas": false,
"daily-notes:Open today's daily note": false,
"templates:Insert template": false,
"command-palette:Open command palette": false,
"bases:Create new base": false,
"obsidian-git:Open Git source control": false,
"iconic:Open rulebook": false,
"omnisearch:Omnisearch": false
}
},
"active": "579a503273b0c5ec",
"lastOpenFiles": [
"10 Knowledge/Templates/Idea Template.md",
"20 Work/Ideas/# Organizational Data & Analytics Operating Model.md",
"10 Knowledge/CTO Academy/Data/Data Governance.md",
"10 Knowledge/Templates/Weekly Review Template.md",
"10 Knowledge/Templates/Employe - Team Template.md",
"20 Work/Weekly Review",
"10 Knowledge/Templates/Meeting Template.md",
"10 Knowledge/Templates/Project Template.md",
"10 Knowledge/CTO Academy/Data/Data Lineage.md",
"10 Knowledge/CTO Academy/Data/Quizzes/Quiz 01 - Data Foundations.md",
"10 Knowledge/CTO Academy/Data/Quizzes",
"10 Knowledge/CTO Academy/Data/Semantic Layer.md",
"10 Knowledge/CTO Academy/Data/Snowflake Schema.md",
"10 Knowledge/CTO Academy/Data/Star Schema.md",
"10 Knowledge/CTO Academy/Data/Dimension Table.md",
"10 Knowledge/CTO Academy/Data/Fact Table.md",
"10 Knowledge/CTO Academy/Data/Medallion Architecture.md",
"10 Knowledge/CTO Academy/Data/ETL vs ELT.md",
"20 Work/Ideas/Giving everyone a chance to learn management.md",
"20 Work/Ideas/Coaching on management.md",
"10 Knowledge/Templates/Journal Template.md",
"10 Knowledge/Templates/Academy Template.md",
"10 Knowledge/Templates/Decision Template.md",
"10 Knowledge/Templates",
"10 Knowledge/CTO Academy/Data/Data Lake vs Data Warehouse vs Lakehouse.md",
"Welcome.md",
"10 Knowledge/CTO Academy/Data",
"10 Knowledge/CTO Academy.md",
"CTO Academy",
"Executive Playbook.md",
"CTO Academy.md",
"20 Work/Decisions",
"50 Principles",
"90 Archives",
"40 Journal",
"30 Personal Projects/Modji"
]
}
@@ -0,0 +1,116 @@
**Estimated reading time:** 911 minutes
## Definition
A **Business Glossary** is a governed collection of business terms and their agreed definitions.
Its purpose is to make sure important words mean the same thing across the organization.
## Simple Mental Model
> **A Business Glossary is the organization's dictionary.**
Each important term can include a definition, owner, status, exclusions, and related metrics.
## How It Works
Example:
```text
Term: Unique Viewer
Definition: A distinct viewer identity with at least one valid content viewing event during the selected period.
Owner: Digital Product
Exclusions: Internal traffic, automated traffic, invalid playback events
```
The technical implementation may live in [[Semantic Layer]], but the meaning is documented in the glossary.
## Example
Without a glossary:
```text
Marketing: Subscriber = email newsletter subscriber
Product: Subscriber = paid platform subscriber
Finance: Subscriber = billable customer
```
All can make sense in context. The problem is when a dashboard simply says "Subscribers."
## How It Fits Into the Bigger Picture
```text
[[Data Owner]]
Approves business meaning
[[Business Glossary]]
Documents meaning
[[Semantic Layer]]
Implements governed metrics
```
## My Company / Real-World Context
Useful governed terms could include:
- Session
- Viewer
- Unique Viewer
- Audience
- Video Start
- Completion Rate
- Watch Hour
- Active User
- Subscriber
- Registered User
- OTT
- Connected TV
## CTO Perspective
Many reporting disagreements are vocabulary disagreements disguised as technical problems.
A CTO can often improve the discussion by asking:
> **Are we actually using the same definition?**
Start with terms tied to executive decisions, KPIs, financial impact, or repeated disputes.
### Questions to Ask
- Which terms repeatedly cause confusion?
- Does each critical term have an agreed definition?
- Who owns it?
- Is it connected to [[Semantic Layer]]?
- How are changes approved?
- Can employees easily discover the glossary?
## Meeting Scenario
**Situation:** Two reports show 400,000 and 520,000 subscribers.
**Possible response:**
> "Before comparing the numbers, let's confirm what each report means by Subscriber. If one includes free registered accounts and the other only paid accounts, both numbers may be correct but the labels are misleading."
## Key Takeaways
- A Business Glossary is the organization's governed dictionary.
- It documents agreed business definitions and ownership.
- [[Semantic Layer]] implements definitions; the glossary documents meaning.
- Many data disagreements are actually definition disagreements.
## Related Concepts
- [[Semantic Layer]]
- [[Data Governance]]
- [[Data Owner]]
- [[Data Steward]]
- [[Metadata]]
- [[Data Catalog]]
- [[KPI]]
- [[Metric]]
@@ -0,0 +1,103 @@
**Estimated reading time:** 1012 minutes
## Definition
A **Data Catalog** is a searchable inventory of an organization's data assets and their [[Metadata]].
It helps people discover what data exists, what it means, where it comes from, who owns it, and whether it is trusted.
## Simple Mental Model
> **A Data Catalog is Google for your organization's data.**
## How It Works
A Data Catalog may inventory:
- Databases
- Tables
- Columns
- Files
- Dashboards
- Reports
- Metrics
- Models
- Pipelines
- APIs
An entry might show owner, status, description, grain, source, refresh, quality, and downstream use.
## Example
Search:
`Revenue`
Results:
```text
Net Advertising Revenue [Certified]
Subscription Revenue [Certified]
Gross Advertising Revenue
Revenue Forecast [Restricted]
```
Each result includes an owner and business definition.
## How It Fits Into the Bigger Picture
```text
[[Metadata]]
Collected and organized in
[[Data Catalog]]
Datasets + Metrics + Reports + Owners
```
The catalog may surface [[Data Lineage]], [[Data Quality]], [[Business Glossary]], [[Data Owner]], and [[Data Steward]] information.
## My Company / Real-World Context
A new employee should be able to search `Video Completion Rate` and see its definition, owner, dataset, source system, refresh, and dashboards that use it.
## CTO Perspective
Buying a catalog tool does not create governance. A catalog full of stale descriptions is only expensive documentation.
The hard part is the operating model: who maintains it, who certifies assets, what "trusted" means, and how deprecation works.
### Questions to Ask
- Can employees discover trusted data without knowing who created it?
- How do we mark certified vs experimental datasets?
- Who maintains catalog entries?
- Does the catalog show [[Data Lineage]]?
- Does it expose [[Data Quality]] status?
- Are people actually using it?
## Meeting Scenario
**Situation:** Someone proposes an expensive enterprise Data Catalog because "every mature organization needs one."
**Possible response:**
> "Before selecting a platform, let's define the problem. Are we struggling with discoverability, ownership, duplicated datasets, lineage, business definitions, or all of these? Then we can determine the lightest solution that meets the need."
## Key Takeaways
- A Data Catalog is a searchable inventory of data assets and metadata.
- It supports discoverability, self-service, and governance.
- A tool alone does not create governance.
- Operating model and adoption matter more than the interface.
## Related Concepts
- [[Metadata]]
- [[Data Governance]]
- [[Data Lineage]]
- [[Data Quality]]
- [[Business Glossary]]
- [[Data Owner]]
- [[Data Steward]]
@@ -0,0 +1,125 @@
**Estimated reading time:** 1113 minutes
## Definition
A **Data Contract** is an explicit agreement between a data producer and data consumers about the structure, meaning, quality, and reliability of shared data.
## Simple Mental Model
> **A Data Contract is an API contract for data.**
A producer should not unexpectedly change data that downstream consumers rely on.
## How It Works
A contract might specify:
```text
Dataset: Viewing Events
Owner: Streaming Platform
Required fields:
event_id: string
content_id: string
event_time: timestamp
watch_time_ms: integer
platform: string
Freshness:
Available within 15 minutes
Quality:
event_id must be unique
content_id NULL rate < 0.5%
Breaking changes:
60-day notice required
```
## Example
Without a contract:
```text
watch_time_ms renamed
Pipeline breaks
Gold stops updating
Executive dashboard stale
```
With a contract:
```text
Proposed breaking change
Consumers notified
[[Impact Analysis]]
Migration planned
Consumers migrate
Old field removed
```
## How It Fits Into the Bigger Picture
Contracts can define [[Metadata]], expected [[Data Quality]], ownership, and change rules.
[[Data Lineage]] shows who depends on the contract.
## My Company / Real-World Context
If analytics depends on external fields such as `content_id`, `watch_time`, `device`, and `event_time`, important assumptions should be explicit in vendor or internal integration agreements.
## CTO Perspective
Data Contracts are about managing dependencies and accountability.
Ask:
> **What are downstream teams allowed to rely on, and how do producers communicate breaking changes?**
Use stronger contracts where data is critical, highly reused, cross-team, or vendor-controlled.
### Questions to Ask
- Who produces this data?
- Who consumes it?
- What fields and semantics are guaranteed?
- What quality and freshness are expected?
- What counts as a breaking change?
- How much notice is required?
- Can [[Data Lineage]] identify affected consumers?
- Who approves contract changes?
## Meeting Scenario
**Situation:** An internal application team wants to rename analytics fields during a release.
**Possible response:**
> "Before changing the fields, let's identify downstream dependencies and treat this as a data-interface change. We need to agree on the new contract, provide a migration period, and verify affected metrics and reports before removing the old fields."
## Key Takeaways
- A Data Contract defines expectations between producers and consumers.
- It can cover schema, meaning, freshness, quality, ownership, and change management.
- Contracts reduce unexpected downstream breakage.
- [[Data Lineage]] helps identify affected consumers.
- Treat important shared data interfaces with similar discipline to APIs.
## Related Concepts
- [[Data Lineage]]
- [[Data Quality]]
- [[Metadata]]
- [[Data Governance]]
- [[Impact Analysis]]
- [[Data Observability]]
- [[Schema Evolution]]
- [[API Contract]]
@@ -710,27 +710,16 @@ That's governance thinking.
## Related Concepts
- [[Semantic Layer]]
- [[Data Lineage]]
- [[Data Quality]]
- [[Metadata]]
- [[Data Steward]]
- [[Data Owner]]
- [[Business Glossary]]
- [[KPI]]
- [[Measure]]
- [[Fact Table]]
- [[Dimension Table]]
- [[Medallion Architecture]]
@@ -1,4 +1,3 @@
**Time: ~1015 minutes**
Today's goal is that if someone says:
@@ -0,0 +1,102 @@
**Estimated reading time:** 1012 minutes
## Definition
**Data Observability** is the ability to understand the health of data systems and quickly detect, diagnose, and resolve data problems.
## Simple Mental Model
> **Monitoring tells you that a pipeline ran. Data Observability tells you whether the data produced by that pipeline still makes sense.**
## How It Works
Common signals include:
- Freshness
- Volume
- Schema changes
- Distribution changes
- Quality-rule violations
- Downstream impact through lineage
Example:
```text
NULL platform_id
Normal: 0.2%
Today: 46%
```
## Example
A pipeline reports success but processes only 3.2M events when the normal range is 8M10M.
Observability should alert before executives consume the resulting dashboard.
## How It Fits Into the Bigger Picture
```text
[[Data Quality]]
Rules / expectations
+
[[Data Lineage]]
Dependencies
+
Operational telemetry
[[Data Observability]]
Detect + diagnose + alert
```
## My Company / Real-World Context
Useful signals could include:
- Viewing events received/hour
- Missing content ID percentage
- Unknown platform percentage
- Time since last successful load
- Source-to-Gold processing delay
## CTO Perspective
Ask:
> **How do we know our data is broken before a business user tells us?**
Avoid alerting on everything. Prioritize executive KPIs, revenue, compliance, and critical operational dashboards.
### Questions to Ask
- How quickly do we detect stale or incomplete data?
- Do we monitor volume and distribution, not just pipeline status?
- Which critical datasets have automated checks?
- Can alerts show downstream impact through [[Data Lineage]]?
- Who owns incident response?
## Meeting Scenario
**Situation:** Executives repeatedly discover broken dashboards before the data team does.
**Possible response:**
> "The recurring issue isn't only data quality; it's detection. We need observability on critical data products so freshness, volume, schema, and key quality conditions are checked automatically."
## Key Takeaways
- Data Observability detects and diagnoses unhealthy data systems.
- A successful pipeline does not guarantee healthy data.
- Freshness, volume, schema, distributions, and quality are common signals.
- [[Data Lineage]] helps identify downstream impact.
- Prioritize observability based on business criticality.
## Related Concepts
- [[Data Quality]]
- [[Data Lineage]]
- [[Data Governance]]
- [[Metadata]]
- [[Data Contract]]
- [[Monitoring]]
- [[Data Incident]]
+101
View File
@@ -0,0 +1,101 @@
**Estimated reading time:** 810 minutes
## Definition
A **Data Owner** is the person or business role accountable for a data domain, dataset, or important business definition.
The Data Owner has authority over meaning, acceptable use, access, quality expectations, retention, and important business rules.
## Simple Mental Model
> **The Data Owner decides what the data means and what should happen with it.**
IT may host the system. Data Engineering may build the pipeline. An analyst may build the dashboard. None of them automatically owns the business meaning.
## How It Works
Example:
```text
Employee Data
Business owner: HR
IT: operates systems
Data team: pipelines and reporting
```
Ownership is accountability, not technical administration.
## Example
Marketing and Product disagree on `Active User`.
The data team should not silently choose the definition because it owns Power BI.
A Data Owner should approve the business definition, which can then flow into [[Business Glossary]] and [[Semantic Layer]].
## How It Fits Into the Bigger Picture
```text
[[Data Governance]]
[[Data Owner]]
Accountability / decision authority
[[Data Steward]]
Day-to-day quality and maintenance
```
## My Company / Real-World Context
Potential ownership could look like:
- Advertising Revenue → Finance / Advertising business leader
- Employee Data → HR
- Content Metadata → Programming / Content
- Streaming Audience KPI → agreed business owner
Your Data Governance team can facilitate and implement without owning every business concept.
## CTO Perspective
A common failure is confusing system ownership with data ownership.
A useful question is:
> **Who has the authority to make the final business decision about this data?**
If nobody can answer, ownership is unclear.
### Questions to Ask
- Who is accountable for this data?
- Who approves its business definition?
- Who approves access?
- Who establishes acceptable quality?
- Is the owner a business role or merely the person who built the system?
- Is ownership documented?
## Meeting Scenario
**Situation:** Marketing and Product ask your data team to decide the definition of Active User.
**Possible response:**
> "Data can quantify the options and explain the consequences, but this is ultimately a business-definition decision. We need an accountable owner who can approve the definition, after which we'll implement it consistently."
## Key Takeaways
- A Data Owner is accountable for business meaning and appropriate management.
- Ownership is not the same as building or hosting the system.
- Business departments should normally own business meaning.
- [[Data Governance]] should make ownership explicit.
## Related Concepts
- [[Data Steward]]
- [[Data Governance]]
- [[Business Glossary]]
- [[Metadata]]
- [[Data Catalog]]
- [[Semantic Layer]]
- [[KPI]]
@@ -0,0 +1,149 @@
**Estimated reading time:** 1215 minutes
## Definition
**Data Quality** describes whether data is fit for the business purpose for which it is being used.
High-quality data is not simply data that exists or data that successfully loaded into a database. It must be sufficiently accurate, complete, consistent, timely, valid, and unique for the decisions being made from it.
[[Data Governance]] establishes the expectations and accountability for quality. Data Quality measures whether the data actually meets those expectations.
## Simple Mental Model
> **Data Governance defines what "good" means. Data Quality tells us whether today's data is actually good.**
A pipeline can run successfully and still produce poor-quality data.
```text
Pipeline status: SUCCESS
Rows loaded: 1,000,000
Half the platform values are NULL
Technically successful
Business quality: BAD
```
## How It Works
Common dimensions of Data Quality include:
### Accuracy
Does the data correctly represent reality?
### Completeness
Is required data present?
### Consistency
Is the same concept represented the same way across systems?
### Timeliness
Is the data available when the business needs it?
### Validity
Does the data follow expected rules?
### Uniqueness
Are duplicate records creating false counts?
## Example
Suppose Power BI shows:
> Yesterday's watch hours dropped by 35%.
Before concluding that audience behavior changed, the team checks quality:
```text
Source events received yesterday: 6.4M
Normal daily range: 9M10M
```
The dashboard calculation may be correct. The real problem is incomplete source data.
## How It Fits Into the Bigger Picture
```text
Source
[[ETL vs ELT]]
[[Medallion Architecture]]
Bronze
Silver ← quality checks often become critical here
Gold
[[Semantic Layer]]
Power BI
```
[[Data Lineage]] helps locate where a quality problem entered the chain.
## My Company / Real-World Context
For a media company, useful quality checks could include:
- Daily viewing-event volume
- Percentage of missing content IDs
- Duplicate event rate
- Percentage of unknown platforms
- Missing demographic percentage
- Data refresh completion time
- Difference between source-system totals and governed analytics totals
A high "Unknown" percentage is not automatically poor quality. The key question is whether it is expected due to consent, identity availability, or platform limitations, or caused by a collection problem.
## CTO Perspective
Important datasets can have explicit expectations such as:
```text
Daily refresh completed by 07:00
NULL content_id < 0.5%
Duplicate events < 0.1%
Source-vs-ingested row variance < 2%
```
The objective is not perfect data. The objective is quality appropriate to the business decision and risk.
### Questions to Ask
- What quality dimensions matter for this dataset?
- What thresholds define acceptable quality?
- Who owns those thresholds?
- Are quality checks automated?
- Who gets alerted when a check fails?
- Can we trace the issue through [[Data Lineage]]?
- What business decisions are affected when quality fails?
## Meeting Scenario
**Situation:** An executive says, "The dashboard must be wrong. Audience dropped 30% yesterday."
**Possible response:**
> "Before we interpret this as an audience change, let's validate the quality of the underlying data. I want to confirm source volume, pipeline completeness, and whether any upstream fields changed before we conclude that the business actually moved."
## Key Takeaways
- Data Quality means data is fit for its intended business purpose.
- Accuracy, completeness, consistency, timeliness, validity, and uniqueness are common quality dimensions.
- A successful pipeline can still produce poor-quality data.
- [[Data Governance]] defines expectations; Data Quality measures whether they are met.
- [[Data Lineage]] helps identify where problems originated.
## Related Concepts
- [[Data Governance]]
- [[Data Lineage]]
- [[Data Observability]]
- [[Metadata]]
- [[Data Contract]]
- [[Medallion Architecture]]
- [[Semantic Layer]]
- [[KPI]]
@@ -0,0 +1,89 @@
**Estimated reading time:** 810 minutes
## Definition
A **Data Steward** is responsible for the day-to-day care, quality, definition, and proper use of data within a governed domain.
While the [[Data Owner]] is accountable and has decision authority, the steward helps make governance operational.
## Simple Mental Model
> **Owner = accountable. Steward = keeps it working properly day to day.**
## How It Works
A Data Steward may:
- Review quality issues
- Maintain definitions
- Validate classifications
- Coordinate corrections
- Update metadata
- Resolve routine questions
- Escalate policy decisions to the Data Owner
## Example
If the organization defines Roku, Apple TV, Android TV, and Fire TV as `Connected TV`, the owner approves that standard.
The steward helps detect inconsistent classifications and ensures future records follow the standard.
## How It Fits Into the Bigger Picture
```text
[[Data Governance]]
[[Data Owner]]
[[Data Steward]]
[[Data Quality]] + [[Metadata]] + standards
```
## My Company / Real-World Context
You may not need formal "Data Steward" job titles. Stewardship can be assigned to existing roles such as analysts or operations staff.
The key is that someone is clearly responsible for routine health and consistency.
## CTO Perspective
Governance structures can look great on PowerPoint while nobody actually performs the work.
Ask:
> **Who notices when this data becomes wrong, and what are they expected to do?**
### Questions to Ask
- Who performs day-to-day stewardship?
- What quality issues do they monitor?
- What can they decide themselves?
- What must be escalated to the [[Data Owner]]?
- Is stewardship part of their real workload?
- Who updates [[Metadata]] and [[Business Glossary]] entries?
## Meeting Scenario
**Situation:** Stewardship is assigned on paper, but data classifications remain inconsistent.
**Possible response:**
> "We have stewardship assigned, but the recurring issue suggests the operational responsibility isn't clear. Let's define what the steward monitors, what triggers action, and when the owner needs to be involved."
## Key Takeaways
- Data Stewards perform day-to-day governance.
- Owners are accountable; stewards operationalize standards.
- Stewardship does not require a dedicated job title.
- Governance should be lightweight enough to actually operate.
## Related Concepts
- [[Data Owner]]
- [[Data Governance]]
- [[Data Quality]]
- [[Metadata]]
- [[Business Glossary]]
- [[Data Catalog]]
+1 -5
View File
@@ -62,11 +62,7 @@ The columns:
connect the event to [[Dimension Table|Dimension Tables]].
The column:
`watch_seconds`
is a [[Measure]].
The column: `watch_seconds` is a [[Measure]].
Measures are values that can often be aggregated.
+125
View File
@@ -0,0 +1,125 @@
**Estimated reading time:** 1113 minutes
## Definition
A **KPI**, or **Key Performance Indicator**, is a metric selected because it indicates progress toward an important business objective.
Every KPI is a metric. Not every metric is a KPI.
## Simple Mental Model
> **Metric = something we can measure. KPI = a measurement important enough to tell us whether we are succeeding.**
## How It Works
A strong KPI connects:
```text
Business Objective
Desired Outcome
KPI
Target
Actions / Decisions
```
## Example
If the strategic objective is streaming growth, executive KPIs might include:
- Monthly Active Viewers
- Total Watch Hours
- Viewer Retention
- Streaming Revenue
Other metrics can still matter operationally without being KPIs.
## Leading vs Lagging Indicators
**Lagging indicators** measure outcomes after they happen, such as revenue or churn.
**Leading indicators** may provide earlier signals, such as weekly engagement or trial activation.
## How It Fits Into the Bigger Picture
```text
[[Fact Table]]
Raw measures
[[Semantic Layer]]
Governed metrics
[[Business Glossary]]
Agreed meaning
KPI
Power BI
Management decision
```
## My Company / Real-World Context
Potential KPIs could include:
- Monthly Active Viewers
- Total Watch Hours
- Viewer Retention
- Video Start Success Rate
- Advertising Revenue
- WCAG Compliance Rate
- SLA Compliance
If everything is "key," nothing is key.
## CTO Perspective
Bad executive dashboards display whatever is easy to measure.
Good dashboards display what is important to manage.
A CTO should challenge output metrics that do not demonstrate business value.
### Questions to Ask
- What business objective does this KPI represent?
- Why is it "key"?
- Who owns it?
- What is the target?
- What decision changes when this KPI changes?
- Is it leading or lagging?
- Can we trust the underlying [[Data Quality]]?
- Are we measuring output or outcome?
## Meeting Scenario
**Situation:** A department proposes 18 more metrics for the executive dashboard.
**Possible response:**
> "These may all be useful metrics, but which of them directly indicate whether we're achieving our strategic objectives, and what decisions would leadership make differently based on them?"
## Key Takeaways
- Every KPI is a metric, but not every metric is a KPI.
- KPIs should connect directly to business objectives.
- Leading indicators provide earlier signals; lagging indicators measure outcomes.
- Executive dashboards should focus attention.
- CTOs should distinguish output from outcome.
## Related Concepts
- [[Metri]]
- [[Measure]]
- [[Semantic Layer]]
- [[Business Glossary]]
- [[Data Governance]]
- [[Data Quality]]
- [[Data Lineage]]
- [[Leading Indicator]]
- [[Lagging Indicator]]
@@ -0,0 +1,102 @@
**Estimated reading time:** 1113 minutes
# Master Data Management
## Definition
**Master Data Management (MDM)** is the discipline of creating and maintaining consistent, authoritative representations of important business entities across systems.
Common master-data domains include Customer, Product, Employee, Supplier, Location, and Content.
## Simple Mental Model
> **MDM answers: "What is the trusted identity of this thing across the company?"**
## How It Works
Example:
```text
CMS: Show ID = 784
JW Player: Media ID = ABC91
Advertising: Content ID = 55129
Analytics: Content Key = 9031
```
These may all refer to the same program.
MDM establishes mappings and an authoritative representation.
## Example
```text
CMS
"The Great Show - S1E1"
Video Platform
"great_show_ep01"
Programming
Program ID 81817
Advertising
Asset 500992
```
A governed master-content entity can map all of them to one canonical identity.
## How It Fits Into the Bigger Picture
MDM is related to [[Dimension Table]] and [[Data Governance]], but it is broader than analytics.
Master Data can serve operational and analytical systems.
## My Company / Real-World Context
Content is a likely MDM challenge in a media organization because the same content may have identifiers in CMS, video, OTT, linear scheduling, advertising, and analytics systems.
## CTO Perspective
MDM initiatives can become enormous and expensive.
Start with:
> **Which business entity is causing enough inconsistency that centralized management would create meaningful value?**
Do not start with purchasing an MDM platform.
### Questions to Ask
- Which entities exist in multiple systems?
- Which system is authoritative for each attribute?
- How are duplicates resolved?
- How are identifiers mapped?
- Who is the [[Data Owner]]?
- Do we need full MDM tooling or a simpler governed approach?
## Meeting Scenario
**Situation:** Your team spends significant time manually mapping content IDs across systems.
**Possible response:**
> "We clearly have a master-data problem around content identity. Let's define which system owns each attribute and the canonical identity we need before deciding what technology is required."
## Key Takeaways
- MDM manages authoritative identities across systems.
- It addresses inconsistency and duplication.
- Master Data is broader than analytical [[Dimension Table|Dimension Tables]].
- [[Data Governance]] determines ownership and authority.
- Solve the entity problem before choosing the platform.
## Related Concepts
- [[Data Governance]]
- [[Data Owner]]
- [[Dimension Table]]
- [[Natural Key]]
- [[Surrogate Key]]
- [[Metadata]]
- [[Data Quality]]
- [[Entity Resolution]]
+120
View File
@@ -0,0 +1,120 @@
**Estimated reading time:** 911 minutes
## Definition
**Metadata** is data that describes other data.
It provides context needed to understand, discover, govern, and operate datasets.
## Simple Mental Model
> **Data is the book. Metadata is the title, author, table of contents, publication date, and description on the back.**
## How It Works
Metadata can be grouped into several categories.
### Technical Metadata
Table names, columns, data types, keys, schemas.
### Business Metadata
Business definitions, owners, descriptions, certified use.
### Operational Metadata
Refresh time, pipeline duration, row counts, success/failure.
### Governance Metadata
Owner, steward, classification, retention, access rules.
## Example
Without metadata:
```text
tbl_vw_agg_final_v2
dt
uid
cnt
sec
src
```
With metadata:
```text
Name: Daily Viewing Aggregate
Purpose: Daily content consumption reporting
Source: JW Player viewing events
Grain: One row per user/content/day
Owner: Audience team
Refresh: Daily 05:00
sec: Total valid watch seconds
```
## How It Fits Into the Bigger Picture
[[Data Lineage]] uses metadata to understand relationships.
[[Data Governance]] uses metadata to record ownership and classification.
[[Data Quality]] uses metadata to record rules and results.
[[Data Catalog]] makes metadata searchable.
## My Company / Real-World Context
Useful metadata could identify which audience dataset is certified, who owns it, how often it refreshes, and which source systems feed it.
## CTO Perspective
A mature organization moves knowledge from:
```text
People's heads
Documented metadata
Searchable organizational knowledge
```
The useful question is:
> **Is the metadata complete, current, discoverable, and actually used?**
### Questions to Ask
- Who owns this dataset?
- What business purpose does it serve?
- What is its [[Grain]]?
- Where does it come from?
- How often is it refreshed?
- Is it certified for business use?
- Can users discover this information without asking the original developer?
## Meeting Scenario
**Situation:** A new analyst finds four datasets that appear to contain audience information.
**Possible response:**
> "If the only way to know which dataset is trusted is tribal knowledge, that's a scalability problem. Let's make the owner, purpose, status, grain, source, and refresh information discoverable as metadata."
## Key Takeaways
- Metadata is data about data.
- Technical metadata explains structure.
- Business metadata explains meaning.
- Operational metadata explains processing and freshness.
- Governance metadata explains ownership and controls.
- [[Data Catalog]] makes metadata discoverable.
## Related Concepts
- [[Data Catalog]]
- [[Data Governance]]
- [[Data Lineage]]
- [[Data Quality]]
- [[Business Glossary]]
- [[Data Owner]]
- [[Data Steward]]
- [[Grain]]
@@ -0,0 +1,197 @@
# CTO Academy - Data
This is the canonical reading order for the Data module.
## Progress
- [ ] Lesson 01 - [[Medallion Architecture]]
- [ ] Lesson 02 - [[Data Lake vs Data Warehouse vs Lakehouse]]
- [ ] Lesson 03 - [[ETL vs ELT]]
- [ ] Lesson 04 - [[Fact Table]]
- [ ] Lesson 05 - [[Dimension Table]]
- [ ] Lesson 06 - [[Star Schema]]
- [ ] Lesson 07 - [[Snowflake Schema]]
- [ ] Lesson 08 - [[Semantic Layer]]
- [ ] Lesson 09 - [[Data Lineage]]
- [ ] Lesson 10 - [[Data Governance]]
- [ ] Lesson 11 - [[Data Quality]]
- [ ] Lesson 12 - [[Metadata]]
- [ ] Lesson 13 - [[Data Catalog]]
- [ ] Lesson 14 - [[Data Owner]]
- [ ] Lesson 15 - [[Data Steward]]
- [ ] Lesson 16 - [[Business Glossary]]
- [ ] Lesson 17 - [[KPI]]
- [ ] Lesson 18 - [[Master Data Management]]
- [ ] Lesson 19 - [[Data Observability]]
- [ ] Lesson 20 - [[Data Contract]]
---
## Phase 1 - Data Architecture Foundations
### Lesson 01 - [[Medallion Architecture]]
Understand the Bronze → Silver → Gold model and how data matures through the platform.
### Lesson 02 - [[Data Lake vs Data Warehouse vs Lakehouse]]
Understand the major analytical storage architectures and when each is appropriate.
### Lesson 03 - [[ETL vs ELT]]
Understand where transformation happens in the data pipeline and why modern architectures increasingly use ELT.
---
## Phase 2 - Analytical Data Modeling
### Lesson 04 - [[Fact Table]]
Understand how business events and measurements are represented.
### Lesson 05 - [[Dimension Table]]
Understand how descriptive context is attached to business events.
### Lesson 06 - [[Star Schema]]
Understand the standard dimensional model used by analytical and BI systems.
### Lesson 07 - [[Snowflake Schema]]
Understand normalization of dimensions and the trade-off between simplicity and reduced duplication.
---
## Phase 3 - Business Meaning and Trust
### Lesson 08 - [[Semantic Layer]]
Understand how organizations create shared and reusable business definitions.
### Lesson 09 - [[Data Lineage]]
Understand where data comes from, how it changes, where it goes, and how to perform impact analysis.
### Lesson 10 - [[Data Governance]]
Understand the people, policies, ownership, standards, and processes that make organizational data trustworthy.
---
## Phase 4 - Operationalizing Data Governance
### Lesson 11 - [[Data Quality]]
Understand how accuracy, completeness, consistency, timeliness, validity, and uniqueness are measured.
### Lesson 12 - [[Metadata]]
Understand the information that describes datasets, fields, ownership, refresh schedules, and business meaning.
### Lesson 13 - [[Data Catalog]]
Understand how organizations make datasets, metrics, lineage, ownership, and metadata discoverable.
### Lesson 14 - [[Data Owner]]
Understand who is accountable for the business meaning and appropriate management of data.
### Lesson 15 - [[Data Steward]]
Understand who handles the day-to-day operational responsibilities of governed data.
### Lesson 16 - [[Business Glossary]]
Understand how an organization establishes shared definitions for important business concepts.
---
## Phase 5 - Managing Data as a Business Asset
### Lesson 17 - [[KPI]]
Understand the difference between measures, metrics, KPIs, outputs, outcomes, and leading/lagging indicators.
### Lesson 18 - [[Master Data Management]]
Understand how organizations establish authoritative identities for important entities across systems.
### Lesson 19 - [[Data Observability]]
Understand how data teams detect broken, stale, incomplete, or abnormal data before business users discover it.
### Lesson 20 - [[Data Contract]]
Understand how producers and consumers establish explicit expectations for shared data.
---
# Quizzes
- [[Quiz 01 - Data Foundations]]
---
# Mental Model
The technical path:
Source Systems
[[ETL vs ELT]]
[[Medallion Architecture]]
Bronze → Silver → Gold
[[Fact Table]] + [[Dimension Table]]
[[Star Schema]] / [[Snowflake Schema]]
[[Semantic Layer]]
Power BI
Business Decisions
The governance surrounding it:
[[Data Governance]]
├── [[Data Owner]]
├── [[Data Steward]]
├── [[Business Glossary]]
├── [[Metadata]]
├── [[Data Catalog]]
├── [[Data Quality]]
├── [[Data Lineage]]
└── [[Data Contract]]
The operational trust layer:
[[Data Quality]]
+
[[Data Lineage]]
+
[[Data Observability]]
Can we trust the data right now?
---
# CTO Questions to Remember
When presented with data, ask:
1. What business question are we trying to answer?
2. What does one row represent? → [[Fact Table]]
3. What is the [[Grain]]?
4. What dimensions provide context? → [[Dimension Table]]
5. What is the business definition? → [[Business Glossary]]
6. Who owns that definition? → [[Data Owner]]
7. Is the definition implemented consistently? → [[Semantic Layer]]
8. Where did the data come from? → [[Data Lineage]]
9. Can we trust it? → [[Data Quality]]
10. How would we know if it broke? → [[Data Observability]]
11. What happens downstream if the source changes? → [[Data Lineage]]
12. What are producers expected to guarantee? → [[Data Contract]]
@@ -0,0 +1,268 @@
Duration: 30--40 minutes
## Definition
A **project management system** is the repeatable set of roles,
information, routines, and tools used to move work from proposal to
completion.
The goal is not to recreate a heavy PMO. It is to build a lightweight
operating system that makes ownership, commitments, risks, and outcomes
visible.
## Simple Mental Model
> **The owner manages the project. You manage the portfolio and
> exceptions. The system keeps both visible.**
If the system depends on you remembering to chase every project, it is
not yet a system.
## How It Works
### 1. Standard Project Brief
``` markdown
# Project Name
## Owner
## Outcome
What should be different when this succeeds?
## Business Value
Why are we doing it?
## Definition of Done
- [ ]
- [ ]
## Scope
### In Scope
-
### Out of Scope
-
## Milestones
| Milestone | Target | Status |
|---|---|---|
## Dependencies
| Dependency | Owner | Needed By | Status |
|---|---|---|---|
## Risks
| Risk | Probability | Impact | Response | Owner |
|---|---|---|---|---|
## Current Health
Green / Yellow / Red
## Current Status
What changed? What is the next milestone?
## Decisions / Help Needed
-
## Scope Changes
| Date | Change | Impact | Decision |
|---|---|---|---|
```
### 2. Clear Roles
**You**
- Approve/prioritize
- Challenge briefs
- Confirm commitments
- Manage portfolio/capacity
- Resolve priority conflicts
- Escalate cross-team blockers
- Coach owners
**Project owner**
- Draft/maintain brief
- Drive milestones
- Coordinate contributors
- Manage dependencies
- Surface risks and scope changes
- Keep status current
- Escalate
- Drive closure
### 3. Portfolio View
Monday.com becomes the portfolio source of truth.
Emphasize:
- Project
- Owner
- Priority
- Portfolio state
- Health
- Next milestone
- Milestone target
- Major blocker/dependency
- Overall timeline
Detailed execution can remain in subitems/Jira where appropriate.
### 4. Management Cadence
**During the week:** update material changes when they happen.
**Weekly owner update:** health, milestone, forecast, blockers/risks,
scope changes, help needed.
**Weekly/biweekly portfolio review:** Yellow/Red, milestones, priority
conflicts, capacity, new projects, closures.
**Monthly:** Are we doing the right projects? Is WIP too high? Where is
operational load hurting delivery? Which recurring blockers need
systemic fixes?
### 5. Management by Exception
``` text
GREEN → owner manages
YELLOW → manager pays attention/coaches
RED → manager intervenes/escalates
```
## Example
Project Owner Priority Health Next Milestone Target
--------------- ------- ---------- -------- ---------------------------- --------
Umami A High Yellow Production validation Aug 20
QA Automation B Medium Green POC accepted Sep 5
Mogador C High Red Replacement sync validated Aug 15
RAG POC D Low Green POC demo Nov 30
You inspect Mogador first, then Umami. The system tells you where
management attention is required.
## How It Fits Into the Bigger Picture
``` text
Projects vs Operations
Outcome + DoD
Scope
Milestones
Dependencies
Estimate / Forecast
Priority
Capacity / WIP
Risks
Health
Status / Meetings
Ownership
Portfolio
Closure
```
## My Company / Real-World Context
Your original problem was that Monday contained projects and timelines,
but you rarely returned to update it.
The answer is not simply that you need to remember Monday more.
> **Project owner maintains project truth.**
You maintain:
> **Portfolio truth.**
Owners draft briefs, propose timelines, maintain milestones, and surface
exceptions. You validate, challenge, prioritize, coach, and escalate.
## CTO Perspective
This is the transition from personal competence to management
capability.
The test is not:
> Do I know what is happening because I attended every meeting?
It is:
> Can I see what needs attention, trust the information, and intervene
> at the right level?
### Questions to Ask
- Does every project have one owner?
- Is the outcome clear?
- Is DoD explicit?
- Is scope bounded?
- What is the next milestone?
- Are dependencies and risks visible?
- Is the forecast based on real capacity?
- Is health trustworthy?
- What requires my intervention?
- Are we starting too much?
- Which projects can close?
- Is Monday helping decisions or merely storing information?
## Meeting Scenario
**Situation:** You open Monday after two weeks and several projects are
stale because you are still expected to update everything.
**Possible response:**
> The problem isn't that I need to remember Monday more often. Each
> project needs an owner responsible for keeping health, milestones,
> risks, and forecast current. My responsibility is to review the
> portfolio, challenge the information, and intervene where needed.
## Key Takeaways
- Build one lightweight common project method.
- Owners maintain project-level information.
- You maintain priorities, capacity, portfolio health, and escalation.
- Monday becomes the portfolio source of truth.
- Use a standard brief.
- Use a recurring cadence so the system does not depend on memory.
- Manage by exception.
- Limit WIP.
- Close projects deliberately.
- The end goal is repeatable management capability and visible
organizational outcomes.
## Related Concepts
- [[Projects vs Operations]]
- [[Outcomes and Definition of Done]]
- [[Scope and Scope Creep]]
- [[Milestones vs Tasks]]
- [[Dependencies]]
- [[Estimation and Forecasting]]
- [[Prioritization]]
- [[Capacity and WIP]]
- [[Risk Management]]
- [[Project Health]]
- [[Status Reporting]]
- [[Meetings and Follow-up]]
- [[Ownership and Delegation]]
- [[Portfolio Management]]
- [[Closing Projects]]
@@ -0,0 +1,92 @@
Duration: 30--40 minutes
## Definition
Capacity is the amount of work a person or team can realistically take
on. Work in Progress (WIP) is work started but not finished. A WIP limit
deliberately restricts concurrent work.
## Simple Mental Model
**Starting more does not mean finishing more.**
## How It Works
A 35-hour work week is not 35 project hours:
``` text
35 hours
├── 10h operations/tickets
├── 5h meetings/admin
├── 5h support/incidents
└── 15h project capacity
```
The exact split varies. The principle is that operational work consumes
real capacity.
Capacity also depends on specialties. You can have available developer
capacity while QA is overloaded, making QA the bottleneck.
Too much WIP creates context switching:
> Start → interrupt → switch → wait → restart
Reducing WIP can increase throughput even though fewer projects appear
active.
### Example
Two integrators each have four active projects plus tickets. After a
month, all eight projects moved slightly but none finished. Limiting
major active projects can produce fewer "In Progress" rows but more
completed outcomes.
### My Company / Real-World Context
Your team handles projects, Product work, Jira tickets, synchronization
incidents, QA, Data, SEO/WCAG, and meetings. Your portfolio should
eventually show what is truly active and what is intentionally queued.
Operational interruptions that happen every week are not exceptional.
Planning should account for them.
### CTO Perspective
If leadership wants ten initiatives but the organization can reliably
execute four, expose the constraint. Choices include doing fewer things,
reducing scope, extending timelines, adding capacity, reducing
operational load, improving automation, or accepting risk.
### Questions to Ask
- How much project capacity do we actually have?
- What percentage is regularly consumed by operations?
- How many projects are active per owner?
- Which role is the bottleneck?
- What should remain queued?
- What does a new project displace?
### Key Takeaways
- Theoretical hours are not project capacity.
- Operations consume capacity and should be planned for.
- Too much WIP creates context switching and unfinished work.
- WIP limits help teams finish before starting more.
- Bottlenecks may be role-specific.
- A healthy portfolio contains queued work, not only active work.
## How It Fits Into the Bigger Picture
This lesson builds on [[Projects vs Operations]], [[Outcomes and Definition of Done]], [[Scope and Scope Creep]], and [[Milestones vs Tasks]]. It prepares the project system to become
more predictable and scalable.
## Related Concepts
- [[Milestones vs Tasks]]
- [[Dependencies]]
- [[Estimation and Forecasting]]
- [[Prioritization]]
- [[Risk Management]]
- [[Project Health]]
- [[Portfolio Management]]
@@ -0,0 +1,120 @@
Duration: 30--40 minutes
## Definition
**Project closure** confirms that the agreed outcome and Definition of
Done are satisfied, ongoing responsibilities are handed off, and the
project can leave the active portfolio.
A project is not closed simply because development stopped.
## Simple Mental Model
> **Done → accepted → handed off → closed.**
## How It Works
Before closure verify:
### Outcome / DoD
- Was the intended outcome achieved?
- Are mandatory DoD criteria satisfied?
- Has the right stakeholder accepted it?
### Handoff
- Who owns it operationally?
- Is monitoring in place?
- Is documentation sufficient?
- Are support responsibilities clear?
- Are access/credentials transferred where relevant?
### Remaining work
Separate:
- Required for DoD
- Defect that blocks acceptance
- Enhancement/backlog item
- Future Phase 2
Not every improvement needs to keep the project open.
### Lessons learned
Keep it lightweight:
- What worked?
- What caused delay?
- What should we repeat?
- What should change next time?
## Example
QA automation reaches its agreed DoD. Product asks for five more
automated scenarios. If they were not required for the outcome, put them
in backlog or Phase 2 and close the original project.
## How It Fits Into the Bigger Picture
Lesson 1 established that projects are temporary. Lesson 2 created
Definition of Done. Closure is where those ideas are enforced and the
project transitions to operations where necessary.
## My Company / Real-World Context
Monitoring systems, analytics platforms, synchronization processes, QA
automation, and website capabilities all create ongoing
responsibilities.
Every successful project can therefore add operational load. That new
load affects future project capacity and should be visible.
## CTO Perspective
A project that launches without an operational owner, monitoring,
documentation, or support model may simply transfer risk into the
organization.
Closure is not paperwork. It confirms the organization can safely live
with what was delivered.
### Questions to Ask
- Has the outcome been achieved?
- Does the DoD pass?
- Who accepts it?
- Who owns it after closure?
- What operational load does it create?
- Are remaining items blockers or enhancements?
- What did we learn?
- Can it leave the active portfolio?
## Meeting Scenario
**Situation:** Development and QA are complete, but nice-to-have
improvements keep the project open indefinitely.
**Possible response:**
> Let's compare the remaining items to the agreed Definition of Done. If
> the outcome is achieved and these are enhancements, we'll close the
> project and move them into backlog or Phase 2.
## Key Takeaways
- Closure validates outcome and DoD.
- Development completion alone does not close a project.
- Operational ownership must be explicit.
- Enhancements do not necessarily block closure.
- Closure removes unnecessary project overhead.
- Every completed project may create new operational load.
## Related Concepts
- [[Projects vs Operations]]
- [[Outcomes and Definition of Done]]
- [[Scope and Scope Creep]]
- [[Capacity and WIP]]
- [[Portfolio Management]]
@@ -0,0 +1,105 @@
Duration: 30--40 minutes
## Definition
A dependency is something a project needs but does not fully control. It
may be another task, person, team, vendor, environment, approval,
decision, data source, or access requirement. A blocker is a dependency
that is currently preventing progress.
## Simple Mental Model
**What must happen outside this work before we can reach the next
milestone?**
## How It Works
Project owners should identify dependencies early, record who owns them
and when they are needed, follow up before they become blockers, and
escalate when authority or priority is required.
### Dependency types
- Internal: another task or contributor inside the project
- Cross-team: Product, DevOps, Security, IT, Finance, etc.
- External: vendor, partner, contractor
- Decision: approval or choice required before work can proceed
A dependency is not automatically a risk. "DevOps must create the
environment" is a dependency. "DevOps may not have capacity by August
15" is a risk.
### Example
For an analytics implementation:
-----------------------------------------------------------------------
Dependency Owner Needed by Impact if late
----------------- ----------------- ----------------- -----------------
Production DevOps Aug 15 QA cannot start
environment
Security review Security Aug 20 Production
blocked
Tracking Product/Data Aug 5 Implementation
requirements unclear
-----------------------------------------------------------------------
In your environment this matters because project owners frequently
depend on Product, DevOps, Security, vendors, QA, and other departments.
The owner may not control those teams, but still owns making the
dependency visible and following it.
### CTO Perspective
You should not personally chase every dependency. The owner manages
normal follow-up. You intervene when priorities conflict, a committed
milestone is threatened, the owner lacks authority, or the same
bottleneck repeatedly affects projects.
### Questions to Ask
- What does the next milestone depend on?
- Who owns it?
- When is it needed?
- Has the other team actually committed?
- What happens if it is late?
- When should this be escalated?
### Meeting Scenario
**Situation:** The owner says Friday's milestone will slip because
DevOps has not created the environment.
**Possible response:**
> When did we identify the dependency, what date did DevOps commit to,
> and when did we know it was at risk? If you've already followed up and
> the milestone is threatened, I'll help escalate it.
### Key Takeaways
- Dependencies are things the project needs but does not fully
control.
- Blockers are dependencies actively preventing progress.
- Identify dependencies from milestones before they are needed.
- Project owners manage routine follow-up.
- Managers handle cross-team priority and authority escalation.
- Repeated dependency failures may reveal an organizational
bottleneck.
## How It Fits Into the Bigger Picture
This lesson builds on [[Projects vs Operations]], [[Outcomes and Definition of Done]], [[Scope and Scope Creep]], and [[Milestones vs Tasks]]. It prepares the project system to become
more predictable and scalable.
## Related Concepts
- [[Milestones vs Tasks]]
- [[Estimation and Forecasting]]
- [[Prioritization]]
- [[Capacity and WIP]]
- [[Risk Management]]
- [[Project Health]]
- [[Portfolio Management]]
@@ -0,0 +1,103 @@
Duration: 30--40 minutes
## Definition
Estimation predicts the effort or time required for work. Forecasting
combines estimates with capacity, dependencies, uncertainty, and current
progress to predict delivery. Keep **estimate**, **target**, and
**commitment** separate.
## Simple Mental Model
**Estimate the work. Forecast the date. Agree on the commitment.**
## How It Works
A target such as "leadership wants September 1" is not automatically an
estimate or commitment.
Estimate milestone by milestone after outcome, scope, and major
dependencies are understood. Then account for real constraints.
``` text
Requirements 1 week
Implementation 3 weeks
QA 1 week
Deployment 1 week
```
This does not automatically equal six calendar weeks. People have
operational work, dependencies create waiting time, work may overlap,
and uncertainty exists.
Use ranges when uncertainty is high. "6--9 weeks" can be more
responsible early on than false precision.
State assumptions:
> Six weeks assuming DevOps delivers the environment by Aug 10 and the
> owner has roughly 50% project capacity.
If assumptions change, the forecast should change.
### Example
An owner proposes eight weeks:
- 3 weeks implementation
- 1 week QA
- 1 week deployment
- 1 week Product validation
- 2 weeks availability/operational interruption
Do not simply change eight to five. Challenge the assumptions. Can work
overlap? Is the operational allowance supported by history? Can a
dependency start earlier?
### My Company / Real-World Context
Your projects are interrupted by tickets and production issues, so
project effort and calendar duration differ. An 80-hour project can take
many calendar weeks if only 10--15 hours per week are realistically
available.
### CTO Perspective
Aggressive dates do not create capacity. If a target must move earlier,
identify the trade-off: scope, priority, capacity, sequencing,
dependency acceleration, or increased risk.
### Questions to Ask
- What is the estimate based on?
- Which milestone has the most uncertainty?
- What assumptions are we making?
- What capacity is actually available?
- What is the requested target?
- What can the team reasonably commit to?
- What would need to change to deliver sooner?
### Key Takeaways
- Estimate, target, and commitment are different.
- Forecasts combine effort with real constraints.
- Ranges are useful when uncertainty is real.
- Important assumptions should be explicit.
- Challenge estimates by challenging assumptions, not by arbitrarily
shortening them.
- Faster delivery normally requires a trade-off.
## How It Fits Into the Bigger Picture
This lesson builds on [[Projects vs Operations]], [[Outcomes and Definition of Done]], [[Scope and Scope Creep]], and [[Milestones vs Tasks]]. It prepares the project system to become
more predictable and scalable.
## Related Concepts
- [[Milestones vs Tasks]]
- [[Dependencies]]
- [[Prioritization]]
- [[Capacity and WIP]]
- [[Risk Management]]
- [[Project Health]]
- [[Portfolio Management]]
@@ -0,0 +1,102 @@
Duration: 30--40 minutes
## Definition
A project meeting is a coordination mechanism for decisions, blockers,
alignment, and delivery. A meeting is not progress by itself.
**Follow-up** converts discussion into owned actions and decisions.
## Simple Mental Model
> **A useful project meeting changes something.**
At the end you should know what was decided, who owns what, by when,
what is blocked, and what needs escalation.
## How It Works
Do not automatically create a recurring meeting for every project.
A useful review agenda:
1. Outcome / health
2. Last and next milestone
3. Risks/blockers
4. Scope changes
5. Decisions required
6. Actions, owners, dates
Distinguish:
**Decision:** We will use Option B.
**Action:** Alex updates the architecture by Friday.
Avoid "team to investigate." Give actions one owner and a date.
Use asynchronous status for routine information. Use meetings when
synchronous coordination adds value.
## Example
A weekly 60-minute meeting with eight people mostly consists of everyone
describing what they did. Replace the reporting portion asynchronously
and use synchronous time for two blockers and one scope decision.
## How It Fits Into the Bigger Picture
Status reporting communicates project state. Meetings resolve what
cannot efficiently be resolved asynchronously. [[Ownership and
Delegation]] determines who follows through afterward.
## My Company / Real-World Context
Cross-functional work with Product, DevOps, Security, IT, and vendors
can create meeting overload. Your project owner should drive normal
project follow-up. You join when your authority, escalation, or judgment
is required.
## CTO Perspective
If every project requires you in every meeting, **you are the system**.
A scalable leader designs ownership and information flow so their
presence is needed only where it adds value.
### Questions to Ask
- Does this require a meeting?
- What decision must be made?
- Who actually needs to attend?
- What is blocked?
- Who owns each action?
- By when?
- Can the owner follow this without me?
## Meeting Scenario
**Situation:** An owner includes you in a weekly execution meeting where
most discussion is detailed implementation.
**Possible response:**
> I don't need to be in the detailed execution meeting unless there's a
> decision, priority conflict, or escalation requiring me. Keep the
> project status current and bring me in when one of those conditions
> appears.
## Key Takeaways
- Meetings are tools, not evidence of progress.
- Use synchronous time for decisions, blockers, and coordination.
- Actions need owners and dates.
- Capture decisions separately.
- Prefer asynchronous status where possible.
- Project owners should drive normal follow-up.
## Related Concepts
- [[Status Reporting]]
- [[Ownership and Delegation]]
- [[Decision Log]]
- [[Project Health]]
@@ -0,0 +1,666 @@
Duration: 3035 minutes
## Definition
A **task** is a specific piece of work that needs to be performed.
A **milestone** is a significant checkpoint that demonstrates meaningful progress toward the project's outcome.
The distinction matters because managers can easily drown in hundreds of tasks when what they actually need to understand is:
> **Is the project progressing toward its outcome?**
### Task
Examples:
- Configure DNS
- Create database
- Implement tracking script
- Write test cases
- Review documentation
- Configure deployment pipeline
Tasks represent **work**.
### Milestone
Examples:
- Infrastructure ready
- Tracking implementation complete
- Data validation approved
- Production launch complete
- Operational handoff complete
Milestones represent **meaningful states reached by the project**.
---
## Simple Mental Model
Think:
> **Tasks tell the team what to do.**
> **Milestones tell the manager where the project is.**
Or:
```text
TASKS → TASKS → TASKS → MILESTONE
TASKS → TASKS → TASKS → MILESTONE
TASKS → TASKS → TASKS → PROJECT DONE
```
You don't necessarily need to know whether task #37 is complete.
You often need to know:
> "Have we reached the production-ready milestone?"
---
## How It Works
Consider a project to implement Umami.
The project could contain dozens of tasks:
```text
- Create server
- Configure database
- Configure DNS
- Configure SSL
- Deploy Umami
- Configure authentication
- Add tracking script
- Configure events
- Test page views
- Test custom events
- Validate traffic
- Compare data
- Create dashboard
- Write documentation
- Train users
...
```
All legitimate work.
But imagine you're managing 12 projects.
You cannot effectively manage:
> 15 tasks × 12 projects = 180 individual tasks
And that's a small example.
Instead, you might manage Umami through five milestones:
```text
1. Infrastructure ready
2. Tracking implemented
3. Data validated
4. Reporting available
5. Production handoff complete
```
The project owner manages the tasks required to reach those milestones.
You manage primarily through the milestones.
---
## What Makes a Good Milestone?
A milestone should represent a **meaningful state**, not merely arbitrary progress.
Weak:
> 50% development complete
Better:
> Tracking implementation complete and ready for QA
Weak:
> Worked on infrastructure
Better:
> Production infrastructure ready
Weak:
> Meeting with Product completed
Better:
> Requirements approved by Product
The second versions tell you something important about the project's state.
---
### Milestones should be verifiable
Someone should be able to ask:
> "Did we reach this milestone?"
and get a reasonably objective answer.
For example:
> **Data validation complete**
means agreed validation has occurred and the results were accepted.
Compare that with:
> **Data validation underway**
That's a status, not a milestone.
---
## Example
Let's use your **Pipeline QA d'automatisation** project.
### Outcome
> Critical website functionality can be automatically validated before production releases, reducing manual QA effort and identifying regressions earlier.
### Possible Milestones
**Milestone 1: Requirements approved**
The team agrees on:
- Which user journeys are critical
- What should be automated
- What remains manual
---
**Milestone 2: Proof of concept validated**
A small number of tests successfully run automatically.
This reduces an important uncertainty:
> Can our proposed approach actually work?
---
**Milestone 3: Critical test suite complete**
The agreed critical scenarios have been automated.
---
**Milestone 4: Deployment integration complete**
Tests run as part of the agreed deployment workflow.
---
**Milestone 5: QA acceptance complete**
QA validates that the automation meets the agreed requirements.
---
**Milestone 6: Operational handoff complete**
Documentation exists, ownership is established, and the system can move from project work into operations.
Now compare that with:
> Project is 70% complete.
"70%" tells you surprisingly little.
Knowing:
> "The critical test suite is complete, but deployment integration hasn't started"
tells you much more.
---
## How It Fits Into the Bigger Picture
The first four lessons now build directly on each other.
### [[Projects vs Operations]]
> Is this temporary work?
### [[Outcomes and Definition of Done]]
> What are we trying to accomplish, and what counts as finished?
### [[Scope and Scope Creep]]
> What work belongs inside the project?
### [[Milestones vs Tasks]]
> What meaningful checkpoints show us that we're getting there?
Together:
```text
OUTCOME
Where are we going?
SCOPE
What are we delivering?
MILESTONES
How do we know we're
making progress?
TASKS
What needs doing?
DEFINITION OF DONE
```
This order is important.
A common mistake is starting immediately with:
> "Let's create all the Jira tasks."
But you haven't necessarily established what the project is trying to accomplish yet.
---
## My Company / Real-World Context
This concept is particularly relevant to how you should eventually divide responsibility between yourself and your project owners.
You shouldn't need to manage every task performed by your integrators, analysts, QA, or SEO/WCAG person.
The eventual system could look like:
```text
PROJECT OWNER
├── Tasks
├── Detailed sequencing
├── Day-to-day follow-up
└── Contributors
MILESTONES
YOU
```
The project owner should be able to tell you:
> "We're targeting milestone 3 for August 15."
Your job becomes asking:
> "Are we still going to hit August 15?"
rather than:
> "Did Jean complete Jira ticket ABC-234?"
That is a significant difference between **managing projects** and **managing people's task lists**.
---
### Your Monday board
This also gives us our first clue about what might eventually change in Monday.
Your current portfolio has broad timelines.
For example:
```text
Suppression de Mogador
April 2026 ───────────────── January 2027
```
That tells you the project exists for approximately nine months.
But imagine instead seeing:
```text
Suppression de Mogador
Health: 🟡
Current milestone:
Replacement synchronization validated
Target:
September 15
Next milestone:
Production cutover
Target:
October 10
```
Suddenly you can understand the project without opening its entire task list.
We aren't modifying Monday yet, but this is one concept that will eventually influence the design.
---
## Milestones and Dates
Milestones usually have target dates.
This is where something important happens with the problem you've already identified:
> Your projects frequently get interrupted by operations.
Suppose:
```text
Milestone:
Tracking implementation complete
Target:
August 15
```
August 15 arrives.
The milestone isn't complete because the owner spent eight days dealing with production incidents.
Don't simply change:
> August 15 → August 30
and move on.
The missed milestone contains **management information**.
You want to understand:
> Why did we miss it?
Possible reasons:
- Scope increased
- Estimate was wrong
- Operational interruptions
- Dependency wasn't available
- Owner didn't execute
- Requirements weren't clear
- Priority changed
- Technical problem appeared
Those causes require completely different management responses.
A milestone isn't only a deadline.
It creates a **checkpoint where reality meets the plan**.
---
## Milestone vs Deadline
They're related but not identical.
A **deadline** says:
> Something must happen by this date.
A **milestone** says:
> The project has reached this meaningful state.
A milestone commonly has a target date:
> **Milestone:** Data validation complete
> **Target:** September 30
This gives you both:
**What should be true + when we expect it to be true.**
---
## CTO Perspective
As you move higher in an organization, the level at which you manage should change.
An integrator might think about:
> What code needs to be written today?
A project owner might think about:
> What work needs to happen to reach the next milestone?
You might think about:
> Which projects aren't reaching their milestones?
A CTO might think about:
> Which strategic initiatives aren't delivering their expected outcomes?
Think of it as levels:
```text
EXECUTIVE
Outcomes
YOU
Projects / Milestones
PROJECT OWNER
Milestones / Tasks
CONTRIBUTOR
Tasks
```
This doesn't mean a CTO never looks at a task.
It means they **shouldn't need to manage through tasks under normal circumstances**.
---
### Milestones also create accountability
Suppose one of your project owners says:
> "The project is going well."
Your response can be:
> "What's the next milestone?"
They answer:
> "Data validation."
You ask:
> "When?"
> "August 20."
Then August 20 gives you an objective point to review.
Without milestones, project updates easily become:
> "Still working on it."
> "Making progress."
> "Almost there."
> "Waiting on a couple things."
Those statements are difficult to manage.
---
### Don't create too many milestones
Milestones are supposed to simplify project visibility.
A three-month project probably doesn't need 25 milestones.
If every task becomes a milestone, you've recreated the task list.
A useful starting point might be around **37 meaningful milestones** for many of your projects, depending on size and complexity.
The exact number isn't the important part.
Ask:
> **Would I care if this checkpoint wasn't reached?**
If not, it probably doesn't need to be a portfolio-level milestone.
---
### Questions to Ask
- What are the major states this project must pass through before completion?
- What's the next milestone?
- Who owns reaching it?
- What's its target date?
- What must be true before we consider the milestone achieved?
- Are we still confident in the target?
- What could prevent us from reaching it?
- If we missed it, why?
- Was the cause scope, capacity, dependency, execution, or something else?
- Am I managing the project through meaningful checkpoints or micromanaging individual tasks?
---
## Meeting Scenario
**Situation:**
You ask a project owner:
> "How's the project going?"
They respond:
> "Pretty good. We completed about 18 tickets. There's still quite a bit left, but we're making progress."
This gives you very little useful information.
**Possible response:**
> What's the next milestone we're trying to reach, and are we still on track for its target date?
They respond:
> "The next milestone is production data validation on September 15. Development is nearly complete, but we're waiting on DevOps for the production environment, so September 15 is currently at risk."
Now you have something actionable.
The problem isn't:
> "18 tickets completed."
The management information is:
> **Milestone at risk because of a cross-team dependency.**
And because DevOps doesn't report to the project owner, that may be exactly the type of problem that should come to **you**.
---
## Key Takeaways
- **Tasks represent work. Milestones represent meaningful progress.**
- Project owners should generally manage detailed tasks.
- Managers should primarily manage projects through outcomes, milestones, risks, and blockers.
- Good milestones describe verifiable states such as "QA accepted" rather than vague activity such as "working on QA."
- Milestones should usually have target dates.
- A missed milestone is useful management information and should trigger understanding of **why** it was missed.
- Don't automatically move milestone dates without understanding the cause.
- Too many milestones defeats their purpose.
- Milestones help you manage multiple projects without micromanaging every task.
- As leadership responsibility increases, management should increasingly move from **tasks → milestones → outcomes**.
## Related Concepts
- [[Projects vs Operations]]
- [[Outcomes and Definition of Done]]
- [[Scope and Scope Creep]]
- [[Milestones vs Tasks]]
- [[Dependencies]]
- [[Capacity and WIP]]
- [[Project Health]]
- [[Portfolio Management]]
@@ -0,0 +1,549 @@
Duration: 3035 minutes
## Definition
A project should not be defined primarily by **what the team will do**.
It should be defined by **what will be different when the project succeeds**.
This introduces two closely related concepts:
### Outcome
An **outcome** describes the result or change the project is intended to produce.
It answers:
> **What are we trying to achieve?**
### Definition of Done
The **Definition of Done** describes the conditions that must be true before we can legitimately say the project is complete.
It answers:
> **How will we know we're finished?**
These sound simple, but poorly defined outcomes are one of the reasons projects become difficult to manage.
---
## Simple Mental Model
Think:
> **Outcome = destination.**
> **Definition of Done = evidence that we've arrived.**
"Implement Umami" tells me what you're doing.
"Reliable website analytics are collected independently of GA4 and available for internal analysis" tells me **why the project exists and what should be different afterward**.
The Definition of Done then makes that outcome concrete and testable.
---
## How It Works
A common mistake is defining projects using **activities, deliverables and outcomes interchangeably**.
They're different.
Consider:
> **Migrate analytics to Umami.**
### Activity
Something someone does.
Examples:
- Install Umami
- Configure tracking
- Create dashboards
- Test events
- Write documentation
Activities consume effort.
They aren't necessarily evidence of success.
---
### Deliverable
Something the project produces.
Examples:
- Umami installation
- Tracking script
- Dashboard
- Documentation
- Tracking specification
Deliverables are tangible outputs of the work.
But producing a deliverable doesn't automatically mean the desired outcome happened.
---
### Outcome
The resulting capability or change.
For example:
> The organization can collect and analyze the required website analytics through Umami with validated data quality.
That's much closer to the actual reason for doing the project.
So:
```text
Activities
Deliverables
Outcome
```
For example:
```text
Configure tracking Activity
Tracking implementation Deliverable
Reliable analytics available Outcome
```
A good project manager doesn't only ask:
> "Did we complete the tasks?"
They also ask:
> "Did those tasks actually produce the result we wanted?"
---
## Definition of Done
Once the outcome is clear, you need to define what "done" means.
Suppose your project is:
> **Remove Mogador**
A weak Definition of Done would be:
> Mogador migration completed.
That simply restates the project.
A better Definition of Done could be:
- Required data flows no longer depend on Mogador
- Replacement synchronization has been validated
- Production has operated successfully on the replacement
- Monitoring is active
- Required documentation exists
- Operational ownership is established
- Mogador can be safely decommissioned
Now something important happens.
Imagine the development work is finished but monitoring isn't implemented.
Can you close the project?
According to the Definition of Done:
**No.**
You have an objective basis for that decision.
---
## Example
Consider your **Pipeline QA d'automatisation** project.
A weak project description might be:
> Automate QA.
That's vague enough that the project could continue indefinitely.
### Outcome
A possible outcome:
> Critical website functionality can be automatically validated before production releases, reducing manual QA effort and identifying regressions earlier.
Now we understand **why** the project exists.
### Possible Definition of Done
The project might be complete when:
- Critical test scenarios have been identified
- Automated tests exist for the agreed scenarios
- Tests run automatically as part of the deployment process
- Failed tests prevent or flag problematic deployments
- QA can review the results
- The process is documented
- Operational ownership is established
Notice that this doesn't necessarily mean:
> Every possible website test has been automated.
That could take forever.
The Definition of Done creates a boundary.
Version 1 can be completed.
Improvements can continue afterward.
---
## How It Fits Into the Bigger Picture
Lesson 1 gave us:
> [[Projects vs Operations]]
A project is temporary.
But saying "projects have an end" creates another question:
> **What exactly determines that we've reached the end?**
That's where outcome and Definition of Done become important.
Without them:
```text
Start
Lots of tasks
More requests
More tasks
"We're almost finished"
More changes
???
```
With them:
```text
Desired Outcome
Definition of Done
Required Work
Execution
Acceptance
PROJECT CLOSED
Operations / Product
```
This will connect directly to later concepts such as:
- [[Scope]]
- [[Milestone]]
- [[Project Health]]
- [[Risk]]
- [[Stakeholder Management]]
Most importantly, **scope becomes much easier to manage once the outcome is clear**.
When somebody asks:
> "Could we also add X?"
you can ask:
> "Is X required to achieve the agreed outcome?"
That doesn't automatically mean you reject it.
It means you recognize that you're potentially changing the project.
---
## My Company / Real-World Context
This concept is particularly relevant in your environment because projects frequently compete with operational work.
Your team deals with:
- Departmental projects
- Product initiatives
- Tickets
- Synchronization problems
- Production issues
- Data work
- QA
- SEO/WCAG
- Dependencies on DevOps
- Dependencies on Security
- External providers
Without a clearly defined outcome, interruptions make it very easy for a project to lose direction.
You stop for an incident.
You return two weeks later.
Someone requests something new.
Product has another idea.
A dependency changes.
Three months later the project is still active, but the original boundary has become unclear.
A written outcome gives you an anchor:
> **What were we actually trying to accomplish?**
---
### Example: Suppression de Mogador
Instead of:
> **Project:** Suppression de Mogador
you might eventually have:
**Outcome**
> Systems currently dependent on Mogador use the approved replacement architecture, allowing Mogador to be safely retired.
**Definition of Done**
- Required Mogador dependencies identified
- Replacement implemented
- Required historical/current data preserved
- Synchronization validated
- Monitoring implemented
- Business/data validation completed
- Operational owner identified
- Mogador decommissioned
The exact criteria would depend on the real project, but notice how much more manageable the project becomes.
You can now ask:
> Which condition isn't true yet?
Instead of:
> How far along are we with Mogador?
---
## CTO Perspective
At a technology-leadership level, one of the most important shifts is from managing **activity** to managing **outcomes**.
A team can be extremely busy without producing the intended result.
Consider an executive update like:
> We had 14 meetings, completed 38 Jira tickets, configured the environments and finished development.
Those numbers might be useful operationally.
But an executive ultimately wants to know:
> **Did we achieve what we committed to achieve?**
A stronger update might be:
> The replacement synchronization is now running in production and the data has been validated. Monitoring remains outstanding, so the project isn't ready to close yet.
That's outcome-oriented communication.
It also prevents the dangerous:
> "Development is done, therefore the project is done."
Development may only be one part of the outcome.
---
### Outputs vs Outcomes
Technology organizations frequently report **outputs** because they're easy to count.
Examples:
> 42 tickets completed.
> 3 dashboards created.
> 12 APIs developed.
> 1,500 automated tests executed.
Those aren't necessarily bad metrics.
But a CTO needs to ask:
> **What changed because we produced those things?**
For example:
**Output**
> Automated synchronization monitoring implemented.
**Outcome**
> Synchronization failures are detected automatically before they create significant downstream data problems.
The second tells you why the first matters.
---
### Questions to Ask
- What problem are we actually trying to solve?
- What should be different when this project succeeds?
- How will we objectively know that the project is finished?
- Are we measuring completed activity or actual outcomes?
- Who accepts that the Definition of Done has been satisfied?
- Is this new request required for the outcome, or are we expanding the project?
- When the project finishes, who owns what we've created?
---
## Meeting Scenario
**Situation:**
A project has been running for six months.
Development says:
> "We're basically done."
Product says:
> "There are still several things we wanted."
QA says:
> "We haven't fully validated it."
Management asks:
> "So... is the project finished or not?"
Without previously agreed completion criteria, everyone can reasonably have a different answer.
**Possible response:**
> Before we call the project complete, I want us to validate it against the agreed outcome rather than simply whether development has finished. The implementation is complete, but QA validation and the production handoff are still required before we can close the project.
Even better is preventing this situation by defining those criteria **when the project starts**.
---
## Key Takeaways
- Projects should be defined by the **result they are intended to achieve**, not simply by a list of tasks.
- **Activities** are things we do.
- **Deliverables** are things we produce.
- **Outcomes** are the changes or capabilities those deliverables create.
- The **Definition of Done** establishes the conditions required to close the project.
- "Development complete" does not necessarily mean "project complete."
- A clear Definition of Done helps prevent projects from remaining open indefinitely.
- Clear outcomes make it easier to evaluate new requests and eventually control scope.
- Technology leaders should communicate **organizational outcomes**, not merely activity.
## Related Concepts
- [[Projects vs Operations]]
- [[Outcomes and Definition of Done]]
- [[Scope and Scope Creep]]
- [[Milestones vs Tasks]]
- [[Project Health]]
- [[Stakeholder Managemen]]
@@ -0,0 +1,132 @@
Duration: 30--40 minutes
## Definition
**Project ownership** means one person is accountable for driving a
project toward its agreed outcome. The owner does not need to perform
every task.
**Delegation** transfers responsibility and appropriate authority while
keeping enough management visibility to ensure the outcome.
## Simple Mental Model
> **One project, one clearly accountable owner.**
The owner manages the project. You manage the owner, priorities,
escalation, and portfolio.
## How It Works
A project owner should increasingly:
- Draft the project brief
- Clarify outcome and DoD
- Propose scope and milestones
- Identify dependencies and risks
- Coordinate contributors
- Maintain status
- Surface scope changes
- Escalate blockers
- Drive closure
Your role:
- Approve and prioritize
- Challenge the plan
- Confirm commitments
- Coach
- Resolve priority/authority conflicts
- Escalate organizational blockers
- Review outcomes
Delegation can increase progressively:
1. Research and report
2. Recommend a plan
3. Act after approval
4. Act and inform
5. Own the outcome within agreed boundaries
Accountability must come with enough authority to coordinate and
escalate.
## Example
Instead of writing the Umami plan yourself:
> Draft the outcome, DoD, scope, milestones, dependencies, risks, and
> proposed forecast. We'll review it together Friday.
The owner proposes eight weeks. You challenge assumptions and agree on a
commitment. They maintain the project afterward.
## How It Fits Into the Bigger Picture
Everything learned so far becomes information the project owner manages.
This is the transition from:
> Amadou manages every project
to:
> Amadou manages a system in which people can own projects.
## My Company / Real-World Context
You do not have a PMO assigning PMs to your work. Integrators, analysts,
QA, or other team members can own projects depending on capability and
subject matter.
Project ownership also develops employees beyond ticket execution.
## CTO Perspective
Broader technology leadership requires an organization that can operate
without you personally coordinating everything.
The goal is:
> I know the portfolio and intervene where needed.
not:
> Nothing moves unless I chase it.
### Questions to Ask
- Who is the single owner?
- What can they decide without me?
- What must come back to me?
- Are they maintaining the project or am I?
- Are they escalating early?
- Am I coaching or taking the project back?
- Does accountability match authority?
## Meeting Scenario
**Situation:** An owner finds a Product request that changes scope and
immediately asks you what to do.
**Possible response:**
> You've identified the scope change correctly. Before I decide, tell me
> the impact on the milestone and what options you recommend. Bring me
> the trade-off, not only the problem.
## Key Takeaways
- Every project needs one clearly accountable owner.
- Owners drive outcomes; they do not perform every task.
- Owners should draft and maintain the project brief.
- Managers validate, challenge, coach, prioritize, and escalate.
- Delegation increases with capability.
- Accountability must match authority.
- Developing owners makes the system scalable.
## Related Concepts
- [[Portfolio Management]]
- [[Meetings and Follow-up]]
- [[Status Reporting]]
- [[Project Health]]
@@ -0,0 +1,134 @@
Duration: 30--40 minutes
## Definition
**Portfolio management** manages multiple projects as a collection
competing for the same organizational resources.
Project management asks:
> How do we deliver this project?
Portfolio management asks:
> Which projects should we be doing, in what order, and with what
> capacity?
## Simple Mental Model
> **Projects compete with each other. The portfolio makes the trade-offs
> visible.**
## How It Works
A portfolio should answer:
- What is active?
- What is queued?
- What is on hold?
- What is the priority?
- Who owns it?
- What is the health?
- What is the next milestone?
- Where is capacity constrained?
Useful portfolio states:
- Proposed
- Approved / queued
- Active
- On hold
- Closing
- Closed
Approved does not need to mean active.
A portfolio review asks:
1. Which projects changed health?
2. Which milestones slipped?
3. Which need intervention?
4. What new work is proposed?
5. Do we have capacity?
6. What should pause or remain queued?
7. Are priorities still aligned?
The portfolio is not a giant task board.
## Example
Your board has 16 projects and 12 appear active. Capacity review shows
the team can reliably support six major initiatives while handling
operations.
The portfolio decision is not "work faster." It is to choose the active
six, queue the others, and make the trade-off explicit.
## How It Fits Into the Bigger Picture
\[\[Prioritization]] decides relative importance.[[Capacity and
WIP]] determines how much can be active.[[Project Health]]
identifies where intervention is needed. Portfolio management combines
them.
## My Company / Real-World Context
Your Monday board is already attempting to be a portfolio. It has
projects, priority, owner, status, and timelines.
The eventual goal is for it to answer:
> **What needs my attention?**
rather than merely:
> What projects exist?
## CTO Perspective
Portfolio management is a major shift from execution to organizational
leadership. Every project approval consumes people, money, and attention
that cannot simultaneously be used elsewhere.
> **Every project approval is a resource-allocation decision.**
### Questions to Ask
- Why are we doing this?
- What is its priority relative to others?
- Do we have capacity to start?
- What will it displace?
- How many projects are active?
- Which are Yellow/Red?
- Where are bottlenecks?
- Which projects should pause or stop?
- What should start next?
## Meeting Scenario
**Situation:** Leadership approves another initiative and asks when your
team can begin.
**Possible response:**
> I'll add it to the portfolio and assess it against current priorities
> and capacity. If it must start immediately, I'll show which existing
> commitment would need to move so we can make that trade-off
> explicitly.
## Key Takeaways
- Portfolio management manages projects as a competing collection.
- Approved does not mean active.
- Queued and on-hold states are healthy.
- Portfolio views focus on management information, not task detail.
- Priority, capacity, WIP, and health come together here.
- Starting new work should expose what it displaces.
## Related Concepts
- [[Prioritization]]
- [[Capacity and WIP]]
- [[Project Health]]
- [[Status Reporting]]
- [[Ownership and Delegation]]
@@ -0,0 +1,93 @@
Duration: 30--40 minutes
## Definition
Prioritization is the deliberate decision about which work receives
scarce capacity first. A priority is meaningful only if it changes what
the team does.
## Simple Mental Model
**Priority means what wins when two important things compete for the
same capacity.**
## How It Works
If ten projects are all High, you have not prioritized them.
Useful factors include business value, urgency, risk reduction, fixed
deadlines, strategic alignment, dependencies, effort, and cost of delay.
Priority is relative:
``` text
1. Production incident
2. Supabase migration
3. Umami
4. QA automation
5. RAG POC
```
A new top priority should force the question:
> What is no longer the top priority?
### Strategic vs Urgent
Urgent work can consume all capacity while important strategic work
never progresses. Some capacity may need protection from recurring
urgency.
### Example
Product requests an urgent website enhancement while an integrator is
committed to an Umami milestone. Do not silently add it. Decide whether
it outranks Umami and, if so, record which milestone moves.
### My Company / Real-World Context
Your team receives work from your roadmap, Product, operational
incidents, Jira requests, IT/security needs, vendors, and leadership.
Without explicit prioritization, the loudest request can become the real
priority.
### CTO Perspective
The leadership question is not merely "Is this valuable?" Most portfolio
items are valuable. Ask:
> Is this more valuable **now** than the work it will displace?
### Questions to Ask
- What happens if we do not do this now?
- Is there a fixed deadline?
- What business outcome does it support?
- What does it unblock?
- What will move if this becomes priority?
- Who can change the priority?
### Key Takeaways
- Prioritization allocates scarce capacity.
- Everything cannot be High.
- Priority must resolve conflicts between work.
- New urgent work should expose what it displaces.
- Constant reprioritization damages predictability.
- Managers should resolve cross-project priority conflicts rather than
leaving contributors to choose.
## How It Fits Into the Bigger Picture
This lesson builds on [[Projects vs Operations]],[[Outcomes and Definition of Done]],[[Scope and Scope Creep]], and [[Milestones vs Tasks]]. It prepares the project system to become
more predictable and scalable.
## Related Concepts
- [[Milestones vs Tasks]]
- [[Dependencies]]
- [[Estimation and Forecasting]]
- [[Capacity and WIP]]
- [[Risk Management]]
- [[Project Health]]
- [[Portfolio Management]]
@@ -0,0 +1,113 @@
Duration: 30--40 minutes
## Definition
**Project health** is a concise assessment of whether a project is
likely to achieve its agreed outcome within its current commitments.
A common model is:
- **Green:** on track; no material intervention required.
- **Yellow:** at risk; attention or corrective action is needed.
- **Red:** off track or blocked; significant intervention or decision
is required.
## Simple Mental Model
> **Project health answers: Do I need to worry or intervene?**
Green does not mean people are busy. It means the evidence supports
confidence in delivery.
## How It Works
Health should consider:
- Next milestone and target
- Current forecast
- Scope stability
- Dependencies
- Risks/issues
- Capacity
- Quality/acceptance
- Decisions required
Yellow should be an early-warning state, not a punishment.
Example:
Umami's production validation is due Aug 20. Development is complete,
but DevOps now expects the environment Aug 18 and QA needs four days.
The deadline has not passed, but the project is already **Yellow**.
Do not wait until Aug 21 to discover the problem.
## How It Fits Into the Bigger Picture
Milestones provide checkpoints. Dependencies and risks explain threats.
Forecasting predicts delivery. Health compresses those signals into a
portfolio-level indicator.
## My Company / Real-World Context
Your Monday board currently shows execution status, but your management
need is closer to:
``` text
Umami Yellow
Supabase Green
Mogador Red
QA Automation Green
Data Governance Yellow
```
Then you focus your attention on Yellow and Red rather than opening
every project.
## CTO Perspective
Health indicators enable **management by exception**. But the colors
must be trustworthy.
If owners keep projects Green until failure is undeniable, the system is
useless. Make early Yellow reporting useful rather than treating it as
failure.
### Questions to Ask
- What is the next milestone?
- Is the forecast still credible?
- What is the biggest risk?
- Is scope stable?
- Are dependencies committed?
- What specifically would return Yellow to Green?
- Does this need my intervention?
## Meeting Scenario
**Situation:** A project owner reports Green because no deadline has
been missed, but a critical vendor deliverable has no confirmed date.
**Possible response:**
> I would mark this Yellow. Health should reflect whether we're likely
> to hit the commitment, not only whether we've already missed it. What
> action will give us confidence in the vendor dependency?
## Key Takeaways
- Health is forward-looking.
- Green/Yellow/Red need shared definitions.
- Yellow is an early-warning state.
- Percent complete is not project health.
- Health should reflect milestones, risks, dependencies, scope, and
forecast.
- Reliable health enables management by exception.
## Related Concepts
- [[Milestones vs Tasks]]
- [[Risk Management]]
- [[Dependencies]]
- [[Status Reporting]]
- [[Portfolio Management]]
@@ -0,0 +1,456 @@
Duration: 2530 minutes
## Definition
### What is a project?
A **project** is a temporary effort undertaken to create a specific, unique outcome.
A project has:
- A defined objective or outcome
- A beginning
- An end
- Work required to reach that end
- Someone accountable for delivering it
The important word is **temporary**.
Once the desired outcome has been achieved, the project should end.
### What are operations?
**Operations** are recurring activities required to keep a service, product, system, or organization functioning.
Operations generally:
- Repeat
- Continue indefinitely
- Have no natural completion date
- Maintain an existing capability rather than create a new one
A useful distinction:
> **Projects create or change something. Operations run and maintain something.**
---
## Simple Mental Model
Ask:
> **"Can I clearly describe what happens when this work is finished?"**
If yes, it is probably a **project**.
If the answer is essentially "we keep doing it," it is probably **operations**.
---
## How It Works
Consider three types of work.
### 1. Project
You currently use System A and want to replace it with System B.
The work might involve:
1. Evaluate System B
2. Design the migration
3. Migrate the data
4. Test
5. Train users
6. Deploy
7. Decommission System A
Eventually:
**Done.**
The project disappears from the active project list.
### 2. Operations
Your team monitors production websites.
Every week:
- Alerts occur
- Tickets arrive
- Bugs are investigated
- Services are monitored
- Problems are resolved
There is no point where you say:
> "Great. Production monitoring is complete forever."
It continues because it is an operational responsibility.
### 3. Project that creates an operation
This is extremely common in technology.
Suppose you introduce a new monitoring platform.
**Project:**
> Implement automated website monitoring.
Once implemented, the project ends.
But it creates a new operational responsibility:
> Monitor alerts and respond to incidents.
The project therefore moves through:
**Build → Deliver → Operate**
A common management mistake is never making that transition explicit. The "project" then remains open indefinitely even though the project itself finished months ago.
---
## Example
Imagine the company wants automated testing for website releases.
### Project
**Implement an automated website testing pipeline**
Outcome:
> Critical website tests run automatically before deployment.
Possible project work:
- Identify critical tests
- Select tooling
- Build test suite
- Integrate with deployment pipeline
- Validate results
- Document process
- Train the team
Once those things are delivered and accepted:
**Project closed.**
### Operations
Afterward:
> Maintain and operate the automated testing pipeline.
Your team might:
- Investigate failed tests
- Add tests as websites change
- Update dependencies
- Fix broken automation
That work continues.
It shouldn't keep the original implementation project permanently open.
---
## How It Fits Into the Bigger Picture
This distinction matters because projects and operations need different forms of management.
**Projects require:**
- Outcomes
- Scope
- Milestones
- Deadlines
- Dependencies
- Risks
- Completion criteria
**Operations require:**
- Service levels
- Processes
- Capacity
- Quality measures
- Recurring responsibilities
- Operational KPIs
This also connects directly to what you've been learning about **measurement and output**.
For projects, useful output might be:
> "Migration completed and accepted."
For operations, output might instead be:
> "95% of requests completed within SLA."
You shouldn't necessarily measure both types of work the same way.
---
## My Company / Real-World Context
### My organizational context
My team's capacity is shared between several types of work:
- Departmental projects
- Product initiatives and continuous product work
- Operational responsibilities and incidents
- Tickets and requests
- Work dependent on IT teams such as DevOps and Security
This means that project delays cannot be understood only by looking at project timelines. Project work competes with operational and product work for the same finite team capacity.
----
Your Monday board gives us several good examples.
### Umami
This looks like a project if the objective is something such as:
> Implement Umami analytics and migrate the required tracking from the existing solution.
There should eventually be a point where implementation is complete.
Afterward, however, maintaining analytics becomes operational work.
---
### Suppression de Mogador
This sounds strongly project-oriented.
There is a target state:
> Mogador is no longer required and can be safely decommissioned.
Once that state is achieved, the project ends.
---
### Pipeline QA d'automatisation
If you're **building** the QA pipeline:
**Project.**
Once the pipeline exists, maintaining and using it becomes:
**Operations.**
---
### Monitoring de la synchro Mogador
This one is interesting.
If the objective is:
> Create automated monitoring for the Mogador synchronization.
That's a **project**.
If the work is:
> Regularly monitor Mogador synchronization and intervene when problems occur.
That's **operations**.
The title alone doesn't tell us which one it is.
And that's already useful.
---
### Gouvernance des données
This is where things get more complicated.
Data governance itself is **not a project**.
You don't eventually announce:
> "Data governance is finished."
It's an ongoing organizational capability.
However:
> Establish the company's first Data Governance Framework
could absolutely be a project.
That project might deliver:
- Data ownership model
- Governance policies
- Data classification
- Data quality process
- Data catalog
- Governance committee
- Roles and responsibilities
Once established, the project ends.
Then:
> Operate the Data Governance Program
becomes ongoing work.
This distinction is especially important for large initiatives.
---
## CTO Perspective
A technology leader isn't simply managing a list of work.
They need to understand **what kind of work the organization is doing**.
If projects and operations are mixed together, several problems appear.
A project board can become permanently full because operational responsibilities never leave it.
The organization can also appear to have enormous numbers of "projects" when much of the workload is actually recurring operational work.
More importantly, both consume the **same people's capacity**.
Suppose an integrator theoretically has 35 hours available.
They might spend:
- 15 hours on tickets and support
- 5 hours on maintenance
- 5 hours in meetings
- 10 hours on projects
From a project-planning perspective, that person doesn't have 35 hours of project capacity.
They have roughly **10**.
This is one reason understanding projects vs operations becomes important later when we study **capacity and WIP**.
### Questions to Ask
- What specific outcome makes this project complete?
- Is this temporary work, or will someone need to continue doing it indefinitely?
- When this project ends, what operational responsibility does it create?
- Who will own that responsibility after the project closes?
- Are recurring operational activities consuming capacity that I'm currently treating as available project capacity?
---
## Meeting Scenario
**Situation:**
Your VP asks:
> "Why is the team working on so many projects? I see 15 projects assigned to the department."
You review the list and realize several entries are actually recurring activities such as monitoring, maintenance and ongoing governance.
**Possible response:**
> We're currently mixing projects and operational responsibilities in the same portfolio. I'm separating them so we can see how many actual projects we're delivering and how much team capacity is being consumed by ongoing operations. That should give us a more accurate picture of our project capacity.
That is considerably more useful than simply saying the team is busy.
---
## Key Takeaways
- A **project is temporary** and delivers a specific outcome.
- **Operations are ongoing** activities required to maintain a capability or service.
- Projects often **create something that later becomes operational**.
- A broad initiative such as "Data Governance" can contain projects without itself being a project.
- Mixing projects and operations makes workload and capacity harder to understand.
- Every project should have a point where you can confidently say **"this is done."**
- Before estimating project capacity, you need to understand how much capacity operations already consume.
## Related Concepts
- [[Outcomes and Definition of Done]]
- [[Scope and Scope Creep]]
- [[Milestones vs Tasks]]
- [[Capacity and WIP]]
- [[Portfolio Management]]
@@ -0,0 +1,108 @@
Duration: 30--40 minutes
## Definition
A **risk** is an uncertain event or condition that could affect the
project's outcome, schedule, scope, quality, cost, or operations. An
**issue** is a problem that is already happening.
## Simple Mental Model
> **Risk = might happen. Issue = is happening.**
Good project management tries to identify important uncertainty before
it becomes a surprise.
## How It Works
Use a lightweight four-step process:
1. **Identify** what could prevent the outcome or next milestone.
2. **Assess** probability and impact.
3. **Respond** by avoiding, mitigating, transferring/sharing, or
accepting the risk.
4. **Monitor** the important risks as the project changes.
You do not need fake numerical precision. Low / Medium / High is often
enough.
Example:
--------------------------------------------------------------------------
Risk Probability Impact Response Owner
-------------- -------------- -------------- -------------- --------------
DevOps Medium High Confirm Project owner
unavailable commitment
before QA early
--------------------------------------------------------------------------
A dependency is something you know the project needs. A risk is
uncertainty around what might happen.
## Example
Your project is on schedule, but Security has not reviewed an
architecture required for production. The deadline has not slipped yet,
but the unresolved review is a material risk. The project may already
deserve Yellow health.
## How It Fits Into the Bigger Picture
Dependencies tell you what the project needs. Estimation exposes
assumptions. Risk management asks what could make those assumptions
fail. [[Project Health]] then reflects important risks before
deadlines are actually missed.
## My Company / Real-World Context
Likely project risks in your environment include vendor delivery, DevOps
availability, Security approval, Product requirement changes,
operational interruptions, QA availability, data quality, and key-person
dependencies.
Focus on the few risks capable of materially changing delivery rather
than maintaining a huge register nobody reads.
## CTO Perspective
A project should not remain Green merely because nothing bad has
happened yet. Leadership status must be forward-looking.
### Questions to Ask
- What could prevent the next milestone?
- What assumptions are we relying on?
- Which risk has the highest impact?
- Who owns the response?
- What can we do now?
- What signal tells us the risk is becoming an issue?
- Does this risk change project health?
## Meeting Scenario
**Situation:** Security has not reviewed a required architecture and
production is approaching.
**Possible response:**
> The milestone hasn't slipped yet, but the unresolved Security review
> is now a material delivery risk. Let's get a committed review date and
> escalate if that date threatens production.
## Key Takeaways
- Risks are uncertain future events; issues are current problems.
- Identify risks before they become blockers.
- Focus on material risks.
- Assess probability and impact.
- Significant risks need an owner and response.
- Health should reflect major risks before a deadline is missed.
## Related Concepts
- [[Dependencies]]
- [[Project Health]]
- [[Estimation and Forecasting]]
- [[Capacity and WIP]]
- [[RAID]]
@@ -0,0 +1,608 @@
Duration: 3035 minutes
## Definition
**Scope** defines the boundaries of a project.
It answers:
> **What is this project responsible for delivering, and what is it not responsible for delivering?**
A project's scope normally includes:
- What will be delivered
- Which systems, features, teams, or processes are affected
- What work is included
- What is explicitly excluded
- Important constraints or assumptions
**Scope creep** occurs when additional work is added to a project without properly reconsidering the impact on time, resources, priorities, or the agreed outcome.
The important distinction is:
> **Change is not the problem. Unmanaged change is the problem.**
---
## Simple Mental Model
Think of scope as a box:
```text
PROJECT
┌────────────────────────────────┐
│ │
│ Work required to │
│ achieve the outcome │
│ │
└────────────────────────────────┘
"Could we also add X?"
Is X inside the box?
```
If not, you have three legitimate choices:
> **Reject it, replace something else, or expand the project.**
What you shouldn't do is silently add it while keeping the same expectations for deadline and capacity.
---
## How It Works
Lesson 2 established:
> **Outcome = where we're trying to go.**
> **Definition of Done = evidence that we've arrived.**
Scope defines:
> **What journey have we agreed to take to get there?**
Consider a project:
**Implement Umami analytics**
### Outcome
> The organization can independently collect and analyze the required website analytics using Umami with validated data quality.
### In Scope
For example:
- Deploy Umami
- Configure production environment
- Implement tracking on agreed websites
- Define required events
- Validate tracking
- Create required dashboards
- Document the implementation
- Establish operational ownership
### Out of Scope
Potentially:
- Replacing the organization's entire data warehouse
- Rebuilding unrelated Power BI reports
- Redesigning website consent management
- Building a full CDP
- Replacing every GA4 use case
- Tracking mobile applications
Those things might all be valuable.
But:
> **Valuable does not automatically mean part of this project.**
---
### Scope should follow the outcome
A useful test for proposed work is:
> **Is this necessary to achieve the agreed outcome?**
Suppose someone says:
> "Since we're implementing Umami, could we also create personalized audience segments?"
Ask whether that is necessary for the agreed outcome.
If the outcome is simply reliable independent web analytics:
Probably not.
That doesn't mean:
> "No, we're never doing it."
It means:
> "That's a separate requirement. We need to decide whether we're adding it to this project or treating it as future work."
That's scope management.
---
## Scope Creep
Imagine the original project contains:
```text
Umami
├── Installation
├── Web tracking
├── Event tracking
├── Validation
└── Dashboard
```
During implementation:
Product:
> "Can we add another website?"
Marketing:
> "Can we track campaign audiences too?"
Management:
> "Could this replace GA4 entirely?"
Data:
> "If we're doing this, maybe we should rebuild the reporting model."
Developer:
> "We could also automate the deployment."
Individually, every request may sound reasonable.
Three months later:
```text
Umami
├── Installation
├── Web tracking
├── Event tracking
├── Validation
├── Dashboard
├── Second website
├── Campaign analytics
├── GA4 replacement
├── Reporting redesign
├── Automated deployment
└── Mobile tracking
```
But the deadline never changed.
Then management asks:
> "Why is Umami late?"
This is classic scope creep.
The project didn't necessarily execute slowly.
**The project became larger while the original expectations remained unchanged.**
---
## Example
Imagine a project initially approved as:
> **Implement automated QA for critical website functionality.**
### Original Scope
**In Scope**
- Identify critical user journeys
- Automate agreed tests
- Run tests before production deployment
- Generate failure reports
- Document the process
**Out of Scope**
- Complete automation of every website test
- Performance testing
- Security penetration testing
- Mobile application testing
- Replacing all manual QA
Halfway through, Product asks:
> "Could we automate visual regression too? It would help ensure everything stays beautiful."
Potentially useful.
But it's new work.
The project owner should not simply say:
> "Sure."
They should identify it as a scope change.
---
## How It Fits Into the Bigger Picture
Our first three lessons now form a chain.
### Lesson 1: [[Projects vs Operations]]
> Is this temporary work with an end?
### Lesson 2: [[Outcomes and Definition of Done]]
> What are we trying to achieve, and how do we know we're finished?
### Lesson 3: [[Scope and Scope Creep]]
> What work have we agreed belongs inside this project?
Together:
```text
PROJECT
├── Why does it exist?
│ ↓
│ OUTCOME
├── What counts as finished?
│ ↓
│ DoD
└── What are its boundaries?
SCOPE
```
Only after those questions are reasonably clear does it make sense to create detailed tasks and schedules.
Otherwise you can produce an excellent project plan for a poorly defined project.
---
## My Company / Real-World Context
Scope management is especially important in your environment because your projects cross several organizational boundaries.
A project can involve:
- Your integrators
- QA
- Data
- SEO/WCAG
- Product
- DevOps
- Security
- Vendors
- Other business departments
Each participant can introduce legitimate requirements.
That's where projects can quietly grow.
---
### Product relationship
Product may identify something valuable during implementation.
For example:
> "While we're changing this page, could we also improve X?"
The wrong PM lesson would be:
> Always say no.
The better response is:
> **Understand the impact before committing.**
Sometimes the answer should absolutely be yes.
But then something may need to change:
```text
More Scope
Potentially more
├── Time
├── Capacity
├── Cost
├── Risk
└── Dependencies
```
This is sometimes called the **triple constraint** or project management triangle, commonly expressed through scope, time and cost/resources.
The exact models vary, but the management principle is simple:
> You generally cannot change one major project constraint indefinitely while pretending everything else remains fixed.
---
### Operational interruptions are NOT necessarily scope creep
This distinction is particularly important for your team.
Suppose an integrator is working on Umami.
Then synchronization breaks.
They stop Umami for two days and fix production.
Did Umami's scope increase?
**No.**
The project was interrupted by operational work.
That's a **capacity issue**, not scope creep.
Compare:
**Operational interruption**
> "Stop working on Umami and fix the broken synchronization."
Project scope didn't change.
**Scope change**
> "While implementing Umami, add tracking to three additional websites."
The project itself became larger.
This distinction will matter when diagnosing why your projects are late.
---
## CTO Perspective
Technology leaders constantly receive good ideas.
That's part of the problem.
Many organizations don't suffer from a shortage of ideas. They suffer from an inability to decide **which ideas deserve resources now**.
A CTO therefore needs to be comfortable saying:
> "That's a good idea, but it isn't part of this project."
Importantly, that isn't the same as:
> "No."
It could mean:
> "Let's put that into the backlog."
or:
> "Let's make it Phase 2."
or:
> "If this is now more important than Feature X, let's replace X."
or:
> "We can include it, but we need to revise the timeline."
This changes the conversation from confrontation to **trade-offs**.
---
### Your project owners should manage scope too
This connects directly to our discussion after Lesson 2.
Eventually:
```text
YOU
│ Approve project
PROJECT OWNER
├── Draft outcome
├── Draft DoD
├── Draft scope
├── Build milestones
└── Propose timeline
YOU REVIEW / CHALLENGE
AGREED COMMITMENT
```
Once execution begins, the owner should also recognize:
> "That's not in our agreed scope."
They shouldn't necessarily reject the request themselves.
They should **surface it**.
For example:
> "We can add that. It's outside the scope we originally agreed on, so I need to check the impact on the current milestone before committing."
That's project ownership.
---
### Scope changes should be visible
You don't necessarily need heavyweight change-control forms.
For your environment, something lightweight could eventually be enough:
```text
## Scope Changes
| Date | Change | Requested By | Impact | Decision |
|---|---|---|---|---|
| Aug 12 | Add second website | Product | +1 week estimate | Approved |
```
Now six months later, when someone asks why the original September deadline became October, you have organizational memory.
That's much stronger than:
> "There were a lot of changes."
---
### Questions to Ask
- What exactly is included in this project?
- What is explicitly not included?
- Is this request necessary to achieve the agreed outcome?
- Is this a clarification of existing scope or genuinely new work?
- If we add this, what does it change?
- Should something else be removed?
- Should this become Phase 2 instead?
- Who has authority to approve a scope change?
- Has the timeline been updated to reflect the additional work?
- Are we blaming scope when the real problem is operational interruptions or insufficient capacity?
---
## Meeting Scenario
**Situation:**
A project is already underway.
Product asks:
> "Since we're already working on this part of the website, can we add these three improvements? They're related and it would make sense to do everything together."
The ideas are reasonable.
Your developer says they can probably do them but warns that additional work is required.
The original deadline hasn't changed.
**Possible response:**
> Those improvements make sense, but they're additional to what we originally committed to. Before adding them, let's estimate the impact. Then we can decide whether they belong in the current project, replace something already planned, or become a second phase.
Notice what you didn't say:
> "No."
And you also didn't say:
> "Sure."
You forced a **decision**.
That's the management skill.
---
## Key Takeaways
- **Scope defines the boundaries of the project.**
- Scope should support the project's agreed outcome.
- **In scope** identifies what the project is responsible for delivering.
- **Out of scope** makes important exclusions explicit.
- Valuable ideas are not automatically part of the current project.
- **Scope creep is unmanaged expansion of project work.**
- Changing scope is legitimate when its impact is understood and accepted.
- Additional scope usually affects time, capacity, cost, risk, or other commitments.
- Operational interruptions are **not scope creep** if they don't change what the project must deliver.
- Project owners should identify and surface scope changes rather than silently accepting them.
- A technology leader manages new requests through **trade-offs**, not simply yes/no decisions.
## Related Concepts
- [[Projects vs Operations]]
- [[Outcomes and Definition of Done]]
- [[Scope and Scope Creep]]
- [[Milestones vs Tasks]]
- [[Capacity and WIP]]
- [[Change Management]]
- [[Portfolio Management]]
@@ -0,0 +1,119 @@
Duration: 30--40 minutes
## Definition
**Status reporting** communicates the minimum information stakeholders
need to understand current project state, expected delivery, major
changes, and required decisions.
A status report is not a diary of everything the team did.
## Simple Mental Model
> **Where are we? What is next? What threatens it? What do you need from
> me?**
## How It Works
A lightweight update can contain:
``` text
Health:
Outcome:
Next milestone:
Target:
What changed:
Top risk/blocker:
Decision/help needed:
```
Different audiences need different depth:
- Project team: detailed execution
- You: milestones, risks, scope, forecast, blockers
- VP/executive: outcome, health, consequence, decision required
Report meaningful changes, not noise.
Weak:
> Waiting on Security.
Better:
> Security review is outstanding. If not completed by Aug 15, production
> validation will move by at least one week.
## Example
Weak update:
> We completed seven tickets and development is progressing.
Better:
> **Yellow.** Implementation is complete. Production validation is
> targeted for Aug 20. The DevOps environment is four days late, leaving
> insufficient QA time. We need delivery by Aug 16 to preserve the
> target.
## How It Fits Into the Bigger Picture
[[Project Health]] tells you whether attention is required. Status
reporting explains why, what changed, and what action is needed.
## My Company / Real-World Context
You communicate across Product, IT, vendors, and upper management.
Translate technical events into delivery consequences.
Instead of "the sync API returns errors," say what that means for the
milestone and outcome.
## CTO Perspective
Bad news reported early is manageable. Bad news discovered late damages
confidence.
The goal is not to make every project look Green. It is to make
leadership confident that you know what is happening and are managing
it.
### Questions to Ask
- What changed?
- What is the health?
- What is the next milestone?
- Is the forecast credible?
- What is the main risk/blocker?
- What is the consequence?
- What decision/help is required?
## Meeting Scenario
**Situation:** Your VP asks for an update on a project with a vendor
blocker.
**Possible response:**
> The project is Yellow. Development is complete, but vendor validation
> is blocking Friday's production milestone. The vendor committed to a
> fix tomorrow. If that slips, launch moves approximately one week. No
> executive action is needed yet; I'll escalate if tomorrow's commitment
> is missed.
## Key Takeaways
- Report delivery, not activity.
- Tailor detail to the audience.
- Lead with health and outcome.
- Explain consequences.
- State decisions/help required.
- Early transparent reporting builds trust.
## Related Concepts
- [[Project Health]]
- [[Milestones vs Tasks]]
- [[Risk Management]]
- [[Portfolio Management]]
@@ -0,0 +1,73 @@
# Project Management
## Course Progress
- [x] [[Projects vs Operations]]
- [x] [[Outcomes and Definition of Done]]
- [x] [[Scope and Scope Creep]]
- [x] [[Milestones vs Tasks]]
- [ ] [[Dependencies]]
- [ ] [[Estimation and Forecasting]]
- [ ] [[Prioritization]]
- [ ] [[Capacity and WIP]]
- [ ] [[Risk Management]]
- [ ] [[Project Health]]
- [ ] [[Status Reporting]]
- [ ] [[Meetings and Follow-up]]
- [ ] [[Ownership and Delegation]]
- [ ] [[Portfolio Management]]
- [ ] [[Closing Projects]]
- [ ] [[Building My PM System]]
---
## Learning Path
### Foundation
1. [[Projects vs Operations]]
2. [[Outcomes and Definition of Done]]
3. [[Scope and Scope Creep]]
4. [[Milestones vs Tasks]]
### Planning and Delivery
5. [[Dependencies]]
6. [[Estimation and Forecasting]]
7. [[Prioritization]]
8. [[Capacity and WIP]]
9. [[Risk Management]]
### Managing Projects
10. [[Project Health]]
11. [[Status Reporting]]
12. [[Meetings and Follow-up]]
13. [[Ownership and Delegation]]
### Managing the Portfolio
14. [[Portfolio Management]]
15. [[Closing Projects]]
### Build the System
16. [[Building My PM System]]
---
## End Goal
Build a repeatable project management system where:
- Every project has a clear outcome and Definition of Done.
- Scope and major milestones are agreed before commitment.
- A project owner within the team drives each project.
- Project owners maintain their own project information.
- Dependencies, risks and blockers become visible early.
- Estimates account for actual capacity and operational interruptions.
- Scope changes result in explicit trade-offs.
- I manage through milestones and outcomes rather than individual tasks.
- Project health tells me where my intervention is required.
- The portfolio shows what the team has committed to and whether we have capacity for more work.
- Monday.com becomes a management tool rather than a project list that nobody updates.
+4
View File
@@ -0,0 +1,4 @@
L'égalité, c'est donner les mêmes attentes. L'équité, c'est adapter le niveau d'accompagnement selon la situation. Chatgpt
Les détails font la perfection mais la perfection n'est pas un détail. Leonardo Da Vinci
+150
View File
@@ -0,0 +1,150 @@
---
type: contract
vendor:
status: active
category:
contract_start:
contract_end:
annual_cost:
currency:
contract_value:
billing_frequency:
payment_terms:
auto_renewal:
notice_days:
notice_deadline:
renewal_status: not-due
purchase_order:
account_manager:
criticality: medium
---
<%*
const vendor = await tp.system.prompt("Vendor name");
if (!vendor) {
new Notice("Contract creation cancelled.");
return;
}
const safeVendor = vendor
.replace(/[\\/:\*?"<>|]/g, "-")
.trim();
const startDate = await tp.system.prompt(
"Contract start date (YYYY-MM-DD)"
);
const endDate = await tp.system.prompt(
"Contract end date (YYYY-MM-DD)"
);
if (!startDate || !endDate) {
new Notice("Contract creation cancelled: dates required.");
return;
}
const startYear = startDate.substring(0, 4);
const endYear = endDate.substring(0, 4);
const currentFile = tp.file.find_tfile(tp.file.path(true));
await app.fileManager.processFrontMatter(
currentFile,
(frontmatter) => {
frontmatter.vendor = vendor;
frontmatter.contract_start = startDate;
frontmatter.contract_end = endDate;
}
);
const folder = "20 Work/Contracts/Active";
if (!app.vault.getAbstractFileByPath("20 Work/Contracts")) {
await app.vault.createFolder("20 Work/Contracts");
}
if (!app.vault.getAbstractFileByPath(folder)) {
await app.vault.createFolder(folder);
}
await tp.file.move(
`${folder}/${safeVendor} - ${startYear}-${endYear}`
);
tR += `# ${vendor} - ${startYear}-${endYear}`;
-%>
## Contract Summary
**Service / Product:**
**Purpose:**
**Business owner:**
---
## Commercial Terms
**Annual cost:**
**Total contract value:**
**Currency:**
**Billing frequency:**
**Payment terms:**
**Purchase order:**
---
## Renewal
**Contract end:**
**Auto-renewal:**
**Notice period:**
**Notice deadline:**
**Expected price increase:**
**Renewal decision:**
---
## Services / Entitlements
-
---
## Contacts
| Role | Name | Email |
|---|---|---|
| Account Manager | | |
| Technical Contact | | |
| Support | | |
---
## Risks / Considerations
-
---
## Renewal History
-
---
## Notes
-
+164 -40
View File
@@ -1,19 +1,174 @@
# {{title}}
---
date: <% tp.date.now("YYYY-MM-DD") %>
status: proposed
owner: Amadou
project:
---
---
**Date:** {{date}}
**Status:** 🟡 Proposed
**Decision Owner:**
**People Involved:**
<%*
const date = tp.date.now("YYYY-MM-DD");
const year = tp.date.now("YYYY");
const month = tp.date.now("MM");
// --------------------------------------------------
// 1. Ask for decision title
// --------------------------------------------------
const title = await tp.system.prompt("Decision title");
if (!title) {
new Notice("Decision cancelled: no title entered.");
return;
}
const safeTitle = title
.replace(/[\\/:*?"<>|]/g, "-")
.trim();
// --------------------------------------------------
// 2. Find project folders for current year
// --------------------------------------------------
const projectsFolder = `20 Work/Projects/${year}`;
const projectsRoot = app.vault.getAbstractFileByPath(projectsFolder);
let projectFolders = [];
if (projectsRoot && projectsRoot.children) {
projectFolders = projectsRoot.children
.filter(item => item.children)
.sort((a, b) => a.name.localeCompare(b.name));
}
// --------------------------------------------------
// 3. Project dropdown
// --------------------------------------------------
const projectLabels = [
"— No project —",
...projectFolders.map(folder => folder.name)
];
const projectValues = [
null,
...projectFolders
];
const selectedProject = await tp.system.suggester(
projectLabels,
projectValues,
false,
"Related project"
);
if (selectedProject === undefined) {
new Notice("Decision cancelled.");
return;
}
const projectName = selectedProject
? selectedProject.name
: "";
const projectLink = selectedProject
? `[[${projectName}]]`
: "";
// --------------------------------------------------
// 4. Create Decisions/YYYY/MM
// --------------------------------------------------
const baseFolder = "20 Work/Decisions";
const yearFolder = `${baseFolder}/${year}`;
const monthFolder = `${yearFolder}/${month}`;
if (!app.vault.getAbstractFileByPath(yearFolder)) {
await app.vault.createFolder(yearFolder);
}
if (!app.vault.getAbstractFileByPath(monthFolder)) {
await app.vault.createFolder(monthFolder);
}
// --------------------------------------------------
// 5. Build filename
// --------------------------------------------------
let filename = `${date} - ${safeTitle}`;
if (selectedProject) {
const safeProject = projectName
.replace(/[\\/:*?"<>|]/g, "-")
.trim();
filename = `${date} - ${safeProject} - ${safeTitle}`;
}
// --------------------------------------------------
// 6. Move + rename
// --------------------------------------------------
await tp.file.move(`${monthFolder}/${filename}`);
// --------------------------------------------------
// 7. Update Properties AFTER Templater finishes
// --------------------------------------------------
tp.hooks.on_all_templates_executed(async () => {
const file = tp.file.find_tfile(
`${monthFolder}/${filename}`
);
if (!file) return;
await tp.app.fileManager.processFrontMatter(
file,
(frontmatter) => {
frontmatter.date = date;
frontmatter.status = "proposed";
frontmatter.owner = "Amadou";
frontmatter.project = projectLink;
}
);
});
-%>
> 🟡 **Proposed** · 🟢 **Decided** · 🔴 **Rejected** · ⚫ **Superseded**
## Context
What situation led to this decision?
Why is a decision needed?
## Problem
<% tp.file.cursor() %>
What problem are we trying to solve?
## Options Considered
## Decision
What was decided?
## Why
Why was this option chosen?
-
## Consequences
What are we accepting by making this decision?
-
## Related
-
---
## Options Considered _(optional)_
### Option 1
@@ -34,34 +189,3 @@ What problem are we trying to solve?
**Cons:**
-
## Decision
What did we decide?
## Why
Why was this option chosen?
## Risks / Trade-offs
What are we accepting by making this decision?
## Next Steps
- [ ]
- [ ]
## Outcome
_To be completed later._
What actually happened after the decision?
## Lessons Learned
What would I do differently next time?
## Related
- [[]]
@@ -0,0 +1,39 @@
# {{date}} - {{Title}}
**Date:** {{date}}
**Employee:** [[{{Employee Name}}]]
**Type:**
**Related Project:** [[]]
## Context
What happened?
## Facts
-
-
-
## Employee's Explanation
-
## Management Assessment
_Keep facts and interpretation separate._
-
## Expectation / Feedback Given
-
## Follow-up
-
## Sources
-
@@ -1,74 +0,0 @@
# {{title}}
## Role
**Position:**
**Responsibilities:**
## Current Objectives
-
-
-
## Current Projects
-
## 1:1 Notes
### {{date}}
**Topics discussed:**
-
**Employee feedback / concerns:**
-
**My feedback:**
-
**Agreed actions:**
- [ ]
## Performance Observations
### {{date}}
**Situation:**
**Expected outcome:**
**Actual outcome:**
**Impact:**
**Follow-up:**
## Development
### Strengths
-
### Areas for Development
-
### Support / Coaching Provided
-
## Commitments
| Commitment | Owner | Due | Status |
|---|---|---|---|
| | | | |
## Related
- [[]]
@@ -0,0 +1,75 @@
<%*
const employees = [ "Habiba", "Binta", "Slimane", "Jean-Claude", "Joel", "Valery", "Hajar" ];
const employee = await tp.system.suggester( employees, employees, false, "Choose employee" );
if (!employee) return;
const date = tp.date.now("YYYY-MM-DD");
const filename = `${date} - ${employee} 1-1`;
await tp.file.move( `20 Work/Team/${employee}/${employee} 1-1/${filename}` );
-%>
**Date:** <% tp.date.now("YYYY-MM-DD") %>
**Duration:** 30 min
**Employee:** [[<% employee %>]]
## Check-in
How are things?
-
## Current Work
### Projects
-
### Operations
-
## Biggest Blocker
What's getting in the way?
-
## Concerns / Frustrations
Anything frustrating or not working well?
-
## Feedback
### Feedback for them
-
### Feedback for me
-
## Growth
_Only when relevant. Doesn't need to be discussed every 1-1._
-
## Commitments
### Employee
- [ ]
### Manager Commitments
- [ ]
## Follow-up from Previous 1-1
- [ ]
## Notes
-
<% tp.file.cursor() %>
@@ -0,0 +1,64 @@
# {{Employee Name}}
**Role:**
**Team:**
**Manager:** Amadou
**Start Date:**
## Role & Responsibilities
-
-
-
## Operational Responsibilities
-
-
-
## Current Management Focus
_Things I am actively coaching, monitoring, or expecting improvement on._
-
-
## Strengths
_Observed strengths. Keep this evidence-based._
-
## Development Areas
_Areas being developed or coached. Not necessarily performance problems._
-
## Current Commitments
_Only important active commitments. Remove once completed._
- [ ]
## 1-1s
See `1-1/` folder.
## Significant Notes
Significant events are stored as separate notes in this employee's folder.
Examples:
- Performance / delivery
- Important feedback
- Recognition
- Role or responsibility changes
- Significant commitments
- Formal management discussions
## Related
- [[]]
+87 -12
View File
@@ -1,40 +1,115 @@
# {{title}}
---
date:
status: idea
owner: Amadou
project:
strategic_area:
effort:
impact:
---
**Date:** {{date}}
**Status:** 💡 Idea
<%*
const date = tp.date.now("YYYY-MM-DD");
const year = tp.date.now("YYYY");
const title = await tp.system.prompt("Idea title");
if (!title) {
new Notice("Idea creation cancelled: no title entered.");
return;
}
const safeTitle = title
.replace(/[\\/:*?"<>|]/g, "-")
.trim();
const baseFolder = "20 Work/Ideas";
const yearFolder = `${baseFolder}/${year}`;
if (!app.vault.getAbstractFileByPath(yearFolder)) {
await app.vault.createFolder(yearFolder);
}
const filename = `${date} - ${safeTitle}`;
await tp.file.move(`${yearFolder}/${filename}`);
// Update Properties only after Templater finishes
tp.hooks.on_all_templates_executed(async () => {
const file = tp.file.find_tfile(
`${yearFolder}/${filename}`
);
if (!file) return;
await tp.app.fileManager.processFrontMatter(
file,
(frontmatter) => {
frontmatter.date = date;
frontmatter.status = "idea";
frontmatter.owner = "Amadou";
}
);
});
-%>
> 💡 **Idea** · 🔎 **Exploring** · 🟢 **Approved** · ⏸️ **Parked** · ⚫ **Dropped** · 🚀 **Converted**
## The Idea
Describe the idea simply.
Describe the idea in one or two sentences.
<% tp.file.cursor() %>
## Problem / Opportunity
What problem does this solve or what opportunity does it create?
What problem does this solve, or what opportunity does it create?
-
## Why It Matters
What is the potential business value?
## Who Benefits?
-
## Current Situation
How is this handled today?
-
## Possible Approach
How could this work?
What could the solution look like?
## Effort
Keep this high-level. This is not yet a project plan.
**Estimated complexity:** Low / Medium / High
-
## Risks / Questions
## Assumptions / Questions
What needs to be true, or what do I need to validate?
-
-
## Next Step
## Risks / Trade-offs
What is the smallest action needed to validate this idea?
-
## Smallest Next Step
What is the cheapest or fastest action that would tell me whether this is worth pursuing?
-
## Outcome
What ultimately happened with this idea?
-
## Related
@@ -0,0 +1,126 @@
---
date:
jira:
actual_sync_issue: false
status: investigating
classification:
---
<%*
const baseTrackingFolder = "20 Work/Tracking";
// Today's values
const date = tp.date.now("YYYY-MM-DD");
const year = tp.date.now("YYYY");
const month = tp.date.now("MM");
// Find available Tracking folders
const trackingRoot = app.vault.getAbstractFileByPath(baseTrackingFolder);
if (!trackingRoot) {
new Notice("Tracking folder not found.");
return;
}
const folders = trackingRoot.children
.filter(item => item.children)
.map(item => item.name)
.sort();
if (folders.length === 0) {
new Notice("No tracking folders found.");
return;
}
// Select tracking category
const tracking = await tp.system.suggester(
folders,
folders,
false,
"Select tracking folder"
);
if (!tracking) {
new Notice("Tracking cancelled.");
return;
}
// Jira number
const jira = await tp.system.prompt(
"Jira ticket (ex: PBI-123)"
);
if (!jira) {
new Notice("Tracking cancelled: no Jira ticket entered.");
return;
}
// Update YAML properties
const currentFile = tp.file.find_tfile(tp.file.path(true));
await app.fileManager.processFrontMatter(
currentFile,
(frontmatter) => {
frontmatter.date = date;
frontmatter.jira = jira.toUpperCase();
frontmatter.actual_sync_issue = false;
frontmatter.status = "investigating";
frontmatter.classification = null;
}
);
// Create destination folders
const trackingFolder = `${baseTrackingFolder}/${tracking}`;
const yearFolder = `${trackingFolder}/${year}`;
const monthFolder = `${yearFolder}/${month}`;
if (!app.vault.getAbstractFileByPath(yearFolder)) {
await app.vault.createFolder(yearFolder);
}
if (!app.vault.getAbstractFileByPath(monthFolder)) {
await app.vault.createFolder(monthFolder);
}
// Move + rename
await tp.file.move(
`${monthFolder}/${date} - ${jira.toUpperCase()}`
);
// Generate heading
tR += `# ${jira.toUpperCase()}`;
-%>
## Observation
-
## Verification
- Reported time:
- Checked time:
- Expected availability:
- Content available:
### Technical issue identified:
## Outcome
-
---
Available status:
- investigating
- resolved
- monitoring
Available classifications
| Classification | Use when |
| -------------------- | ---------------------------------------------------------------------------------- |
| confirmed-sync-issue | There was an actual technical synchronization problem |
| no-issue-confirmed | Complaint resolved/no technical issue found |
| unrelated-issue | The problem was real, but **not caused by synchronization** |
| user-error | Incorrect action/configuration/input by the requester caused the perceived problem |
| unknown | Insufficient information to determine what happened |
+84 -9
View File
@@ -1,29 +1,104 @@
# {{date}}
<%*
const date = tp.date.now("YYYY-MM-DD");
const year = tp.date.now("YYYY");
## What Happened
await tp.file.move(
`20 Work/Journal/${year}/${date}`
);
-%>
# <% tp.date.now("dddd, MMMM Do YYYY") %>
← [[<% tp.date.now("YYYY-MM-DD",-1) %>]] | **Week <% tp.date.now("WW") %>** | [[<% tp.date.now("YYYY-MM-DD",1) %>]] →
---
## Meetings
- <% tp.file.cursor() %>
---
## Significant Events
-
## Decisions
---
-
## Decisions Made
```dataview
LIST
FROM "20 Work/Decisions"
WHERE startswith(file.name, this.file.name + " - ")
SORT file.name ASC
```
- [[]]
## Ideas
```dataview
LIST
FROM "20 Work/Ideas"
WHERE startswith(file.name, this.file.name + " - ")
SORT file.name ASC
```
---
## People / Management
-
## What I Learned
Feedback given, coaching moments, observations.
-
## What I Could Have Done Better
---
## Projects
Important project changes only.
-
## Follow-up
---
## Leadership Reflection
### What surprised me today?
-
### What did I learn today?
-
### What would I do differently next time?
-
---
## Follow-ups
> Only actions that still belong to me.
> Everything else should already be in **Twos**, **Jira**, or **Monday**.
- [ ]
---
## Created Today
```dataview
TABLE WITHOUT ID
file.link AS "File",
file.folder AS "Location"
FROM "20 Work"
WHERE file.cday = date(this.file.name)
AND file.path != this.file.path
SORT file.ctime ASC
```
---
## Related
- [[]]
+85 -11
View File
@@ -1,19 +1,68 @@
# {{title}}
<%*
const projectName = await tp.system.prompt("Project name");
if (!projectName) {
new Notice("Project creation cancelled: no project name entered.");
return;
}
const year = tp.date.now("YYYY");
const createdDate = tp.date.now("YYYY-MM-DD");
const projectsFolder = "20 Work/Projects";
const yearFolder = `${projectsFolder}/${year}`;
// Remove characters that cannot safely be used in a filename.
const safeProjectName = projectName
.replace(/[\\/:*?"<>|#^[\]]/g, "-")
.replace(/\s+/g, " ")
.trim();
// Create the year folder when it does not already exist.
if (!app.vault.getAbstractFileByPath(yearFolder)) {
await app.vault.createFolder(yearFolder);
}
// Move and rename the active note.
await tp.file.move(`${yearFolder}/${safeProjectName}`);
-%>
---
type: project
project: "<% projectName %>"
status: active
owner:
start_date: <% createdDate %>
target_date:
last_reviewed: <% createdDate %>
stakeholders:
---
- 🟢 **On track / Healthy:** no intervention required
- 🟡 **Attention:** issue exists, but currently manageable
- 🟠 **At risk:** intervention or decision required; commitment is likely to slip
- 🔴 **Critical / Off track:** commitment missed, major blocker, or immediate intervention required
- ⚪ **Unknown:** insufficient information to assess
**Status:** 🟢 Active
**Owner:**
**Start Date:** {{date}}
**Start Date:** <% createdDate %>
**Target Date:**
**Last Reviewed:** <% createdDate %>
**Stakeholders:**
---
## Objective
What are we trying to accomplish?
<% tp.file.cursor() %>
## Business Value
Why are we doing this?
-
## Success Criteria
How will we know the project succeeded?
@@ -33,6 +82,8 @@ How will we know the project succeeded?
## Deliverables
These are project outputs, not personal reminders.
- [ ]
- [ ]
@@ -40,25 +91,35 @@ How will we know the project succeeded?
| Milestone | Owner | Target | Status |
|---|---|---|---|
| | | | |
| | | | ⚪ Unknown |
## Risks
| Risk | Impact | Probability | Mitigation |
|---|---|---|---|
| | | | |
| Risk | Impact | Probability | Mitigation | Owner |
|---|---|---|---|---|
| | | | | |
## Dependencies
-
| Dependency | Owner | Needed By | Status |
|---|---|---|---|
| | | | ⚪ Unknown |
## Decisions
Link only to actual decision notes.
- [[]]
## Current Status
**Overall:** 🟢 On Track / 🟡 At Risk / 🔴 Blocked
**Overall:** ⚪ Unknown
### Latest Update
**Date:** <% createdDate %>
-
### Completed
@@ -72,11 +133,24 @@ How will we know the project succeeded?
-
## Next Actions
## Next Commitment
- [ ]
- [ ]
**Commitment:**
**Owner:**
**Due:**
**Status:** ⚪ Unknown
## Actions
> Execution is tracked in **Monday or Jira**.
> Personal actions belonging to me are tracked in **Twos**.
-
## Lessons Learned
_To be completed during and after the project._
## Related
- [[]]
@@ -0,0 +1,102 @@
<%*
const year = tp.date.now("YYYY");
const date = tp.date.now("YYYY-MM-DD");
const baseFolder = "20 Work/Meetings/Team Meetings";
const yearFolder = `${baseFolder}/${year}`;
if (!app.vault.getAbstractFileByPath(yearFolder)) {
await app.vault.createFolder(yearFolder);
}
await tp.file.move(`${yearFolder}/Team Meeting - ${date}`);
-%>
**Date:** <% tp.date.now("YYYY-MM-DD") %>
**Duration:** 30 min
**Attendees:**
---
# 📢 Announcements
Company / Department / CTO updates
-
-
---
# 🔄 Operations
Anything affecting day-to-day operations?
Examples:
- vacations
- coverage
- SLA concerns
- incoming workload
- incidents
-
-
---
# 🤝 Team Coordination
Things that require coordination between teammates.
Examples:
- handoffs
- dependencies
- waiting on someone
- knowledge transfer
- testing
- reviews
| Topic | Owner(s) | Next Step |
|--------|----------|-----------|
| | | |
---
# ⚠️ Risks / Blockers
Only blockers that need team visibility or help.
| Risk | Owner | Action |
|------|-------|--------|
| | | |
---
# ✅ Decisions
Only decisions affecting the team.
- [[]]
---
# 👏 Recognition
Wins from this week.
-
-
---
# 📋 Action Items
| Action | Owner | Due |
|--------|-------|-----|
| | | |
---
# 📝 Parking Lot
Items requiring another discussion.
-
@@ -1,5 +1,14 @@
# Weekly Review - YYYY-MM-DD (Week XX)
<%*
const year = tp.date.now("YYYY");
const date = tp.date.now("YYYY-MM-DD");
const week = tp.date.now("WW"); // ISO week number
await tp.file.move( `20 Work/Weekly Review/${year}/Week ${week} - Weekly Review - ${date}` );
-%>
← [[Week <% tp.date.now("WW", -7) %> - Weekly Review - <% tp.date.now("YYYY-MM-DD", -7) %>]]
→ [[Week <% tp.date.now("WW", 7) %> - Weekly Review - <% tp.date.now("YYYY-MM-DD", 7) %>]]
## 🎯 Executive Summary (2-3 sentences)
Overall health of the department:
View File
View File
@@ -0,0 +1,274 @@
---
type: contract
vendor: "Algolia"
status: active
category: "Service Order"
contract_start: "2024-01-01"
contract_end: "2026-12-31"
annual_cost: 25074.33
currency: "USD"
contract_value: 75223.0
billing_frequency: "Annual"
payment_terms: "Net 30"
payment_method: "Annual Wire Transfer"
auto_renewal: true
renewal_term_months: 36
notice_days: 60
notice_deadline: "2026-11-01"
renewal_increase_percent: 7
renewal_status: not-due
purchase_order:
account_manager:
criticality: medium
---
# Algolia
## Contract Summary
**Purpose:** Subscription to Search and Ancillary Services
**Service / Product:** Search and Ancillary Services
## Commercial Terms
- Annual cost: 25074.33 USD
- Total contract value: 75223.0 USD
- Billing frequency: Annual
- Payment terms: Net 30
- Payment method: Annual Wire Transfer
## Renewal
- Contract start: 2024-01-01
- Contract end: 2026-12-31
- Auto-renewal: True
- Renewal term: 36 months
- Notice period: 60 days
- Notice deadline: 2026-11-01
- Renewal increase: 7%
## Watch Outs
- Contract automatically renews for additional 36-month terms.
- Non-renewal notice must be provided at least 60 days before the end of the current term.
- Fees increase by 7% at every renewal.
- One-time discounts do not apply to subsequent renewal terms.
- Fees increase by 7% at renewal.
## Services / Entitlements
- Premium Plan (Algolia KeywordSearch)
- Algolia Recommend
- Core Foundation Add-on
## Source Evidence
> Evidence below is taken directly from the locally extracted PDF text.
### Contract Start
- Value: 2024-01-01
- Source page: 3
```text
Unless earlier terminated in accordance with its terms, the term of the Service Order will start on the Start Date and
continue until the End Date as set forth above. Except with respect to professional services, if subscribed, at the end of the
initial term and any renewal term, this Service Order will automatically renew for additional terms of one year each, unless
either party gives the other notice of non-renewal at least sixty (60) days before the end of the then-current term.
Notwithstanding the immediately preceding sentence, all One-Time Discounts set forth above applicable to the initial term or
any renewal term of the Service Order will not apply to a subsequent renewal term. Subscriber acknowledges that all One-
Time Discounts are not intended to be repeated or replicated for affiliates of Subscriber. At each renewal of this Service
Order, Algolia will increase the fee…
```
### Contract End
- Value: 2026-12-31
- Source page: 1
```text
Subscriber Information Billing Information
Groupe Média TFO Groupe Média TFO
Address (Information including for notice) Address
21 College Street 21 College Street
Toronto, Ontario Toronto, Ontario
M5G 2B3 M5G 2B3
Canada Canada
Billing Details
Payment Terms Payment Schedule Method of Payment Billing Currency
Net 30 Annual Wire Transfer USD
Term & Infrastructure Location
Search Infrastructure Location Term (Months) 36.00
Canada Start Date 1-Jan-2024
End Date 31-Dec-2026
QTY Subscribed Services - Search and Ancillary
12,340 Search Units* per each 12-
Premium Plan (Algolia KeywordSearch) price includes 5.95% Volume Discount
months contract year
3,000 Recommend Units*** per each
Algolia Recommend Plan,
Subtotal: $93,627.00
Discount (19.66%): ($18,404.00)
Total Annual Rate: $25,074.33
Total Committed Amount for Initial Term: $75,223.00
Page 1 of 3
```
### Annual Cost
- Value: 25074.33
- Source page: 1
```text
Subscriber Information Billing Information
Groupe Média TFO Groupe Média TFO
Address (Information including for notice) Address
21 College Street 21 College Street
Toronto, Ontario Toronto, Ontario
M5G 2B3 M5G 2B3
Canada Canada
Billing Details
Payment Terms Payment Schedule Method of Payment Billing Currency
Net 30 Annual Wire Transfer USD
Term & Infrastructure Location
Search Infrastructure Location Term (Months) 36.00
Canada Start Date 1-Jan-2024
End Date 31-Dec-2026
QTY Subscribed Services - Search and Ancillary
12,340 Search Units* per each 12-
Premium Plan (Algolia KeywordSearch) price includes 5.95% Volume Discount
months contract year
3,000 Recommend Units*** per each
Algolia Recommend Plan,
Subtotal: $93,627.00
Discount (19.66%): ($18,404.00)
Total Annual Rate: $25,074.33
Total Committed Amount for Initial Term: $75,223.00
Page 1 of 3
```
### Contract Value
- Value: 75223.0
- Source page: 1
```text
Subscriber Information Billing Information
Groupe Média TFO Groupe Média TFO
Address (Information including for notice) Address
21 College Street 21 College Street
Toronto, Ontario Toronto, Ontario
M5G 2B3 M5G 2B3
Canada Canada
Billing Details
Payment Terms Payment Schedule Method of Payment Billing Currency
Net 30 Annual Wire Transfer USD
Term & Infrastructure Location
Search Infrastructure Location Term (Months) 36.00
Canada Start Date 1-Jan-2024
End Date 31-Dec-2026
QTY Subscribed Services - Search and Ancillary
12,340 Search Units* per each 12-
Premium Plan (Algolia KeywordSearch) price includes 5.95% Volume Discount
months contract year
3,000 Recommend Units*** per each
Algolia Recommend Plan,
Subtotal: $93,627.00
Discount (19.66%): ($18,404.00)
Total Annual Rate: $25,074.33
Total Committed Amount for Initial Term: $75,223.00
Page 1 of 3
```
### Auto-Renewal
- Value: True
- Source page: 3
```text
Unless earlier terminated in accordance with its terms, the term of the Service Order will start on the Start Date and
continue until the End Date as set forth above. Except with respect to professional services, if subscribed, at the end of the
initial term and any renewal term, this Service Order will automatically renew for additional terms of one year each, unless
either party gives the other notice of non-renewal at least sixty (60) days before the end of the then-current term.
Notwithstanding the immediately preceding sentence, all One-Time Discounts set forth above applicable to the initial term or
any renewal term of the Service Order will not apply to a subsequent renewal term. Subscriber acknowledges that all One-
Time Discounts are not intended to be repeated or replicated for affiliates of Subscriber. At each renewal of this Service
Order, Algolia will increase the fee…
```
### Notice Period
- Value: 60
- Source page: 3
```text
Unless earlier terminated in accordance with its terms, the term of the Service Order will start on the Start Date and
continue until the End Date as set forth above. Except with respect to professional services, if subscribed, at the end of the
initial term and any renewal term, this Service Order will automatically renew for additional terms of one year each, unless
either party gives the other notice of non-renewal at least sixty (60) days before the end of the then-current term.
Notwithstanding the immediately preceding sentence, all One-Time Discounts set forth above applicable to the initial term or
any renewal term of the Service Order will not apply to a subsequent renewal term. Subscriber acknowledges that all One-
Time Discounts are not intended to be repeated or replicated for affiliates of Subscriber. At each renewal of this Service
Order, Algolia will increase the fee…
```
### Renewal Increase
- Value: 7
- Source page: 3
```text
Unless earlier terminated in accordance with its terms, the term of the Service Order will start on the Start Date and
continue until the End Date as set forth above. Except with respect to professional services, if subscribed, at the end of the
initial term and any renewal term, this Service Order will automatically renew for additional terms of one year each, unless
either party gives the other notice of non-renewal at least sixty (60) days before the end of the then-current term.
Notwithstanding the immediately preceding sentence, all One-Time Discounts set forth above applicable to the initial term or
any renewal term of the Service Order will not apply to a subsequent renewal term. Subscriber acknowledges that all One-
Time Discounts are not intended to be repeated or replicated for affiliates of Subscriber. At each renewal of this Service
Order, Algolia will increase the fee…
```
## Source Files
- `Algolia/2024/[completed] Q-18253 - Groupe Média TFO - SO (1).pdf`
## Notes
-
@@ -0,0 +1,101 @@
---
type: contract
vendor: "Directus"
status: active
category: "Cloud Services"
contract_start: "2026-06-30"
contract_end: "2027-06-29"
annual_cost: 18000.0
currency: "USD"
contract_value: 18000.0
billing_frequency: "Monthly"
payment_terms: "Net 30"
payment_method: "Annual in Advance"
auto_renewal: true
renewal_term_months: 12
customer_notice_days: 30
vendor_notice_days:
notice_deadline: "2027-05-30"
renewal_increase_percent:
renewal_pricing_rule: "fees for Services during any Renewal Term shall be the fees charged by Directus for the respective Services as in effect as of the Cancellation Deadline"
renewal_status: "not-due"
purchase_order:
account_manager:
criticality: medium
---
# Directus
## Contract Summary
**Purpose:** Enterprise Cloud Services
**Service / Product:** Directus Enterprise Cloud
## Commercial Terms
- Annual cost: 18000.0 USD
- Total contract value: 18000.0 USD
- Billing frequency: Monthly
- Payment terms: Net 30
- Payment method: Annual in Advance
## Renewal
- Contract start: 2026-06-30
- Contract end: 2027-06-29
- Auto-renewal: True
- Renewal term: 12 months
- Customer notice: 30 days
- Vendor notice: days
- Customer notice deadline: 2027-05-30
- Fixed renewal increase: %
- Renewal pricing rule: fees for Services during any Renewal Term shall be the fees charged by Directus for the respective Services as in effect as of the Cancellation Deadline
- Renewal status: not-due
## Watch Outs
- Automatic renewal for successive 12-month terms.
- Customer must provide non-renewal notice at least 30 days before the end of the term.
- Renewal pricing is not fixed: renewal uses the vendor's applicable pricing under the contract.
## Services / Entitlements
- Enterprise Tier 2 Cloud
- 1 Production Project for 1 year
- 10 Studio users
- Enterprise license included
- Basic support included w/99.9% uptime SLA
## Source Evidence
> Extracted from the local contract PDF. Review the original contract before making a contractual decision.
### Automatic Renewal
- Value: True
- Source page: 3
> rprise-cloud-agreement, the terms of which are incorporated herein. The initial term of this Order commences on the date of this Order (the “Effective Date”) and continues thereafter for 1 year (the “Initial Term”). This Order for Services will be automatically renewed for successive annual periods (each a “ Renewal Term”) at the expiration of the Initial Term or any Renewal Term, as applicable, unless (i) Customer gives written notice to sales@directus.io at least 30 days prior to the end of the Initial Term or Renewal Term (each such date, a “Cancellation Deadline”), or (ii) Directus gives written notice at le
### Customer Non-Renewal Notice
- Value: 30
- Source page: 3
> Purchase terms By signing this Order, I certify that I am authorized on behalf of the customer identified above to place a binding order for the Directus products and/or services listed below and to commit to the payment obligations specified herein. The use of the Directus services is governed by the Directus Cloud Enterprise Master Service Agreement located at https://directus.com/terms/enterprise-cloud-agreement, the terms of which are incorporated herein. The initial term of this Order commences on the date of this Order (the “Effective Date”) and continues thereafter for 1 year (the “Initial Term”). This Order for Services will be automatically renewed for successive annual periods (each a “ Renewal Term”) at the expiration of the Initial Term or any Renewal Term, as applicable, unless (i) Customer gives written notice to sales@directus.io at least 30 days prior to the end of the Initial Term or Renewal Term (each such date, a “Cancellation Deadline”), or (ii) Directus gives writt…
### Renewal Pricing Rule
- Value: fees for Services during any Renewal Term shall be the fees charged by Directus for the respective Services as in effect as of the Cancellation Deadline
- Source page: 3
> to sales@directus.io at least 30 days prior to the end of the Initial Term or Renewal Term (each such date, a “Cancellation Deadline”), or (ii) Directus gives written notice at least 90 days prior to the end of the Initial Term or Renewal Term. The fees for Services during any Renewal Term shall be the fees charged by Directus for the respective Services as in effect as of the Cancellation Deadline. Payment terms: net 30, Annual in Advance Signature Signature Date Printed name Countersignature Countersignature Date Printed name
## Source Files
- `Directus/2026/Groupe Média TFO - Directus Enterprise Cloud - Renewal.pdf`
## Notes
-
@@ -0,0 +1,74 @@
---
type: contract
vendor: Libeo
status: active
category: Service Contract
contract_start: 2026-04-27
contract_end: 2027-03-31
annual_cost: 7500
currency: CAD
contract_value: 7500
billing_frequency: annual
payment_terms: Net 30
payment_method: Bank transfer
auto_renewal:
renewal_term_months:
customer_notice_days:
vendor_notice_days:
notice_deadline:
renewal_increase_percent:
renewal_pricing_rule:
renewal_status: unknown
purchase_order:
account_manager:
criticality: medium
---
# Libeo
## Contract Summary
**Purpose:** Maintenance Boukili
**Service / Product:** Maintenance Boukili
## Commercial Terms
- Annual cost: 7500.0 USD
- Total contract value: 7500.0 USD
- Billing frequency: Monthly
- Payment terms: Net 30
- Payment method: Bank transfer
## Renewal
- Contract start: 2026-04-27
- Contract end: 2027-03-31
- Auto-renewal: None
- Renewal term: months
- Customer notice: days
- Vendor notice: days
- Customer notice deadline:
- Fixed renewal increase: %
- Renewal pricing rule:
- Renewal status: unknown
## Watch Outs
- No major contractual watch-outs identified automatically.
## Services / Entitlements
- Maintenance Boukili
## Source Evidence
> Extracted from the local contract PDF. Review the original contract before making a contractual decision.
## Source Files
- `Libeo/2026/TFO2627-052 - CS - Libéo (1).pdf`
## Notes
-
@@ -0,0 +1,100 @@
---
vendor: Sentry - 2025-2026
contract_start: 2025-09-21
contract_end: 2026-09-20
type: contract
status: active
category:
- Software Subscription
annual_cost: "352"
currency: USD
contract_value:
billing_frequency: Annual
payment_terms:
auto_renewal: true
notice_days:
notice_deadline:
renewal_status:
- due-soon
purchase_order:
account_manager:
criticality: medium
source_type: renewal-email
---
# Sentry - 2025-2026
## Executive Summary
Sentry Team subscription used by TFO.
The subscription is scheduled to automatically renew on **September 20, 2026**.
The renewal notice was received 30 days before renewal and indicates that the subscription can be modified before the renewal date.
## Services
- Sentry
- Plan: Team
## Financial Summary
| Item | Value |
|---|---:|
| Annual Cost | Unknown |
| Currency | Unknown |
| Billing Frequency | Annual |
| Contract Value | Unknown |
> Financial information was not included in the renewal notice and should be confirmed from invoices, purchase orders, or the Sentry account.
## Renewal
| Item | Value |
|---|---|
| Automatic Renewal | Yes |
| Current Period | 2025-09-21 → 2026-09-20 |
| Renewal Date | 2026-09-20 |
| Renewal Term | 12 months |
| Notice Requirement | Not specified |
| Renewal Increase | Not specified |
## Watch Outs
- **Automatic renewal:** Subscription automatically renews September 20, 2026.
- **Action required:** Review the subscription before September 20 if the plan should be changed or cancelled.
- **Cost unknown:** Renewal notice does not state the upcoming renewal price.
- **Terms incomplete:** Cancellation notice requirements and price increase terms are not provided in this notice.
## Evidence
### Automatic Renewal
> "Annual Contract will automatically renew on Sept. 20, 2026."
**Source:** Sentry Annual Contract Renewal Notice
### Current Contract Period
**Period:** September 21, 2025 September 20, 2026
**Source:** Sentry Annual Contract Renewal Notice
### Plan
**Plan Size:** Team
**Source:** Sentry Annual Contract Renewal Notice
## Missing Information
- [ ] Confirm annual renewal cost
- [ ] Confirm currency
- [ ] Confirm cancellation/notice period
- [ ] Confirm whether renewal price will increase
- [ ] Confirm payment terms
- [ ] Confirm purchase order, if applicable
## Notes
Renewal reminder received 30 days before scheduled renewal.
@@ -0,0 +1,79 @@
---
type: contract
vendor: "Trings"
status: active
category: "Service Agreement"
contract_start: "2025-11-01"
contract_end: "2026-08-31"
annual_cost: 40760.0
currency: "USD"
contract_value: 40760.0
billing_frequency: "Upfront"
payment_terms: "Immediate"
payment_method: "Bank Transfer"
auto_renewal:
renewal_term_months:
customer_notice_days:
vendor_notice_days:
notice_deadline:
renewal_increase_percent:
renewal_pricing_rule:
renewal_status: "unknown"
purchase_order:
account_manager:
criticality: medium
---
# Trings
## Contract Summary
**Purpose:** Customization of Live Event Experience
**Service / Product:** Live Event Customization Services
## Commercial Terms
- Annual cost: 40760.0 USD
- Total contract value: 40760.0 USD
- Billing frequency: Upfront
- Payment terms: Immediate
- Payment method: Bank Transfer
## Renewal
- Contract start: 2025-11-01
- Contract end: 2026-08-31
- Auto-renewal: None
- Renewal term: months
- Customer notice: days
- Vendor notice: days
- Customer notice deadline:
- Fixed renewal increase: %
- Renewal pricing rule:
- Renewal status: unknown
## Watch Outs
- Contract is non-cancelable before its Contract End Date.
- Payment terms are immediate.
- Service customization is subject to client approval and may be rejected.
## Services / Entitlements
- Tag customization — live event overlay tags displayed in French: “Scheduled” and “Preview” → À venir; “LIVE” → En direct; event date rendered in French format per CLIENT screen captures.
- Scheduling and visibility — multiple Live Events may be scheduled weeks in advance while appearing in the livestream shelf individually, beginning three (3) days before the event date.
- Shelf display — the main livestream shelf displays only one (1) upcoming or live event at a time.
## Source Evidence
> Extracted from the local contract PDF. Review the original contract before making a contractual decision.
## Source Files
- `Trings/Tringapps_-_TFO_-_CR001.pdf`
- `Trings/[completed] CONTRACT .pdf`
## Notes
-
+42
View File
@@ -0,0 +1,42 @@
## Upcoming Expiration
```dataview
TABLE
vendor AS "Vendor",
annual_cost AS "Annual Cost",
currency AS "Currency",
contract_end AS "Ends",
renewal_status AS "Renewal"
FROM "20 Work/Contracts"
WHERE status = "active"
AND contract_end >= date(today)
AND contract_end <= date(today) + dur(120 days)
SORT contract_end ASC
```
## Contract with notice deadline
```dataview
TABLE
vendor AS "Vendor",
notice_deadline AS "Notice Deadline",
contract_end AS "Contract End",
annual_cost AS "Annual Cost",
currency AS "Currency"
FROM "20 Work/Contracts"
WHERE status = "active"
AND notice_deadline
SORT notice_deadline ASC
```
## Portfolio by currency
```dataview
TABLE WITHOUT ID
currency AS "Currency",
sum(rows.annual_cost) AS "Annual Commitments"
FROM "20 Work/Contracts"
WHERE status = "active"
GROUP BY currency
```
View File
View File
@@ -0,0 +1,73 @@
**Date:** 2026-07-27
**Status:** 🟢 **Decided**
**Decision Owner:** Amadou
**People Involved:** Amadou, Mohammed B
## Context
New policy is forcing us to look at Canadian alternatives first. They needed to justify if they were American or not. If American and no employees in Canada, then I must submit an exception for this.
## Problem
Determine whether the procurement requirements and ongoing cost of Algolia justify replacing it with an alternative search platform.
Replacing Algolia would affect multiple websites and require significant integration work, including a review and reimplementation of the synchronization between Directus and Algolia.
## Options Considered
### Option 1
**Description:** Leaving them
**Pros:** Could probably be cheaper using services like mielesearch or typesense
-
**Cons:** Very expensive on integration of all websites and full review of the sync code between Directus and Algolia
-
### Option 2
**Description:** Stay with them
**Pros:** Nothing changes
-
**Cons:** Still expensive.
-
## Decision
What did we decide?
Decision is to stay with Algolia
## Why
Why was this option chosen? Cheaper long term and less disruptive
## Risks / Trade-offs
What are we accepting by making this decision?
- We continue accepting Algolia's current recurring cost.
- We may need to maintain a procurement exception.
- This decision delays exploring potentially cheaper alternatives.
## Next Steps
- [ ]
- [ ]
## Outcome
_To be completed later._
What actually happened after the decision? Keeping the same stability in place. No need to redo and force a new system.
## Lessons Learned
What would I do differently next time? N/A
## Related
- [[Algolia - 2024-2026]]

Some files were not shown because too many files have changed in this diff Show More