first March push

main
iOS 9 months ago
parent 90a49c43be
commit ab13e793b6

@ -19,7 +19,7 @@
"601d1cc7-a4f3-4f19-aa9f-3bddd7ab6b1d": {
"locked": false,
"lockedDeviceName": "iPhone",
"lastRun": "2024-03-03T09:00:01+01:00"
"lastRun": "2024-03-10T07:12:39+01:00"
}
}
}

File diff suppressed because one or more lines are too long

@ -1,8 +1,8 @@
{
"id": "media-extended",
"name": "Media Extended",
"version": "3.0.2",
"minAppVersion": "1.5.3",
"version": "3.0.4",
"minAppVersion": "1.5.7",
"description": "Media(Video/Audio) Playback Enhancement for Obsidian.md",
"author": "AidenLx",
"authorUrl": "https://github.com/AidenLx/",

@ -12,8 +12,8 @@
"checkpointList": [
{
"path": "/",
"date": "2024-03-03",
"size": 13839244
"date": "2024-03-10",
"size": 13983098
}
],
"activityHistory": [
@ -3146,7 +3146,35 @@
},
{
"date": "2024-03-03",
"value": 1362
"value": 1397
},
{
"date": "2024-03-04",
"value": 142237
},
{
"date": "2024-03-05",
"value": 2331
},
{
"date": "2024-03-06",
"value": 1391
},
{
"date": "2024-03-07",
"value": 1287
},
{
"date": "2024-03-08",
"value": 2797
},
{
"date": "2024-03-09",
"value": 1338
},
{
"date": "2024-03-10",
"value": 1496
}
]
}

File diff suppressed because one or more lines are too long

@ -1,7 +1,7 @@
{
"id": "obsidian-book-search-plugin",
"name": "Book Search",
"version": "0.6.0",
"version": "0.6.1",
"minAppVersion": "0.15.0",
"description": "Helps you find books and create notes.",
"author": "anpigon",

@ -1520,7 +1520,7 @@
"links": 18
},
"05.02 Networks/Configuring UFW.md": {
"size": 20005,
"size": 22259,
"tags": 2,
"links": 7
},
@ -10299,11 +10299,6 @@
"tags": 0,
"links": 8
},
"00.01 Admin/Calendars/Events/2024-03-05 ⚽️ Real Sociedad - PSG.md": {
"size": 186,
"tags": 0,
"links": 2
},
"00.01 Admin/Calendars/2023-12-19.md": {
"size": 1412,
"tags": 0,
@ -10374,11 +10369,6 @@
"tags": 1,
"links": 2
},
"00.02 Inbox/Yoga.md": {
"size": 1099,
"tags": 4,
"links": 1
},
"00.02 Inbox/Gaslight.md": {
"size": 878,
"tags": 3,
@ -11499,11 +11489,6 @@
"tags": 3,
"links": 2
},
"00.02 Inbox/Invisible Man.md": {
"size": 885,
"tags": 4,
"links": 1
},
"00.01 Admin/Calendars/2024-02-27.md": {
"size": 1412,
"tags": 0,
@ -11540,17 +11525,92 @@
"links": 6
},
"00.01 Admin/Calendars/2024-03-03.md": {
"size": 1412,
"tags": 0,
"links": 7
},
"00.01 Admin/Calendars/2024-03-04.md": {
"size": 1412,
"tags": 0,
"links": 5
},
"00.03 News/How Russian Spies Get Flipped or Expelled, As Told by a Spycatcher.md": {
"size": 16868,
"tags": 5,
"links": 1
},
"00.03 News/The (Many) Vintages of the Century.md": {
"size": 15031,
"tags": 3,
"links": 2
},
"00.03 News/I always believed my funny, kind father was killed by a murderous teenage gang. Three decades on, I discovered the truth.md": {
"size": 26351,
"tags": 3,
"links": 1
},
"00.03 News/The Great Pretenders How two faux-Inuit sisters cashed in on a life of deception.md": {
"size": 41977,
"tags": 4,
"links": 1
},
"00.03 News/The Pentagons Silicon Valley Problem, by Andrew Cockburn.md": {
"size": 32155,
"tags": 2,
"links": 1
},
"00.01 Admin/Calendars/2024-03-05.md": {
"size": 1412,
"tags": 0,
"links": 7
},
"00.01 Admin/Calendars/Events/2024-03-05 ⚽️ Real Sociedad - PSG (1-2).md": {
"size": 434,
"tags": 0,
"links": 2
},
"00.01 Admin/Calendars/2024-03-06.md": {
"size": 1412,
"tags": 0,
"links": 7
},
"03.01 Reading list/Invisible Man.md": {
"size": 885,
"tags": 4,
"links": 2
},
"00.01 Admin/Calendars/2024-03-07.md": {
"size": 1412,
"tags": 0,
"links": 7
},
"00.01 Admin/Calendars/2024-03-08.md": {
"size": 1705,
"tags": 0,
"links": 7
},
"00.01 Admin/Calendars/2024-03-09.md": {
"size": 1412,
"tags": 0,
"links": 6
},
"03.01 Reading list/Yoga.md": {
"size": 1099,
"tags": 4,
"links": 2
},
"00.01 Admin/Calendars/2024-03-10.md": {
"size": 1255,
"tags": 0,
"links": 4
}
},
"commitTypes": {
"/": {
"Refactor": 6976,
"Create": 2490,
"Link": 9064,
"Expand": 2123
"Refactor": 6989,
"Create": 2503,
"Link": 9097,
"Expand": 2127
}
},
"dailyCommits": {
@ -11561,40 +11621,44 @@
"3": 12,
"4": 46,
"5": 16,
"6": 69,
"7": 897,
"8": 1139,
"9": 1068,
"6": 70,
"7": 908,
"8": 1142,
"9": 1097,
"10": 751,
"11": 549,
"12": 6740,
"13": 675,
"11": 551,
"12": 6745,
"13": 676,
"14": 574,
"15": 640,
"16": 706,
"17": 815,
"18": 1005,
"19": 939,
"18": 1006,
"19": 943,
"20": 867,
"21": 777,
"22": 749,
"23": 1351
"21": 779,
"22": 750,
"23": 1354
}
},
"weeklyCommits": {
"/": {
"Mon": 2890,
"Tue": 1713,
"Wed": 7884,
"Thu": 1341,
"Fri": 1452,
"Mon": 2919,
"Tue": 1719,
"Wed": 7892,
"Thu": 1344,
"Fri": 1458,
"Sat": 0,
"Sun": 5373
"Sun": 5384
}
},
"recentCommits": {
"/": {
"Expanded": [
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-03-08.md\"> 2024-03-08 </a>",
"<a class=\"internal-link\" href=\"05.02 Networks/Configuring UFW.md\"> Configuring UFW </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/Events/2024-03-05 ⚽️ Real Sociedad - PSG (1-2).md\"> 2024-03-05 ⚽️ Real Sociedad - PSG (1-2) </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/Events/2024-03-05 ⚽️ Real Sociedad - PSG.md\"> 2024-03-05 ⚽️ Real Sociedad - PSG </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/Events/2024-03-01 ⚽️ AS Monaco - PSG.md\"> 2024-03-01 ⚽️ AS Monaco - PSG </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/Events/2024-03-01 ⚽️ AS Monaco - PSG.md\"> 2024-03-01 ⚽️ AS Monaco - PSG </a>",
"<a class=\"internal-link\" href=\"01.06 Health/2023-12-15 Eczema.md\"> 2023-12-15 Eczema </a>",
@ -11641,13 +11705,22 @@
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/Events/2024-01-20 ⚽️ US Orleans - PSG.md\"> 2024-01-20 ⚽️ US Orleans - PSG </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/Events/2024-01-20 ⚽️ US Orleans - PSG.md\"> 2024-01-20 ⚽️ US Orleans - PSG </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/Events/2024-01-20 ⚽️ US Orleans - PSG.md\"> 2024-01-20 ⚽️ US Orleans - PSG </a>",
"<a class=\"internal-link\" href=\"03.02 Travels/Hoch Ybrig.md\"> Hoch Ybrig </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/Hoch Ybrig.md\"> Hoch Ybrig </a>",
"<a class=\"internal-link\" href=\"05.02 Networks/Configuring UFW.md\"> Configuring UFW </a>",
"<a class=\"internal-link\" href=\"01.02 Home/Bandes Dessinées.md\"> Bandes Dessinées </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/Sawerdo.md\"> Sawerdo </a>"
"<a class=\"internal-link\" href=\"03.02 Travels/Hoch Ybrig.md\"> Hoch Ybrig </a>"
],
"Created": [
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-03-10.md\"> 2024-03-10 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-03-09.md\"> 2024-03-09 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-03-08.md\"> 2024-03-08 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-03-07.md\"> 2024-03-07 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-03-06.md\"> 2024-03-06 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-03-05.md\"> 2024-03-05 </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/The Spy War How the C.I.A. Secretly Helps Ukraine Fight Putin.md\"> The Spy War How the C.I.A. Secretly Helps Ukraine Fight Putin </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/The Pentagons Silicon Valley Problem, by Andrew Cockburn.md\"> The Pentagons Silicon Valley Problem, by Andrew Cockburn </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/The Great Pretenders How two faux-Inuit sisters cashed in on a life of deception.md\"> The Great Pretenders How two faux-Inuit sisters cashed in on a life of deception </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/I always believed my funny, kind father was killed by a murderous teenage gang. Three decades on, I discovered the truth.md\"> I always believed my funny, kind father was killed by a murderous teenage gang. Three decades on, I discovered the truth </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/The (Many) Vintages of the Century.md\"> The (Many) Vintages of the Century </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/How Russian Spies Get Flipped or Expelled, As Told by a Spycatcher - VSquare.org.md\"> How Russian Spies Get Flipped or Expelled, As Told by a Spycatcher - VSquare.org </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-03-04.md\"> 2024-03-04 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-03-03.md\"> 2024-03-03 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-03-02.md\"> 2024-03-02 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/Events/2024-03-01 ⚽️ AS Monaco - PSG.md\"> 2024-03-01 ⚽️ AS Monaco - PSG </a>",
@ -11685,22 +11758,20 @@
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-02-14.md\"> 2024-02-14 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-02-13.md\"> 2024-02-13 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-02-12.md\"> 2024-02-12 </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/His Best Friend Was a 250-Pound Warthog. One Day, It Decided to Kill Him..md\"> His Best Friend Was a 250-Pound Warthog. One Day, It Decided to Kill Him. </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/A Teens Fatal Plunge Into the London Underworld.md\"> A Teens Fatal Plunge Into the London Underworld </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/How Nikola Jokić Became the Worlds Best Basketball Player.md\"> How Nikola Jokić Became the Worlds Best Basketball Player </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/Nat Friedman Embraces AI to Translate the Herculaneum Papyri.md\"> Nat Friedman Embraces AI to Translate the Herculaneum Papyri </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/Paper mills are bribing editors at scholarly journals, Science investigation finds.md\"> Paper mills are bribing editors at scholarly journals, Science investigation finds </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-02-11.md\"> 2024-02-11 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/Events/2024-02-10 ⚽️ PSG - Lille OSC.md\"> 2024-02-10 ⚽️ PSG - Lille OSC </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-02-10.md\"> 2024-02-10 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-02-09.md\"> 2024-02-09 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-02-08.md\"> 2024-02-08 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-02-07.md\"> 2024-02-07 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-02-06.md\"> 2024-02-06 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-02-05.md\"> 2024-02-05 </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/Why Tim Cook Is Going All In on the Apple Vision Pro.md\"> Why Tim Cook Is Going All In on the Apple Vision Pro </a>"
"<a class=\"internal-link\" href=\"00.02 Inbox/His Best Friend Was a 250-Pound Warthog. One Day, It Decided to Kill Him..md\"> His Best Friend Was a 250-Pound Warthog. One Day, It Decided to Kill Him. </a>"
],
"Renamed": [
"<a class=\"internal-link\" href=\"03.01 Reading list/Yoga.md\"> Yoga </a>",
"<a class=\"internal-link\" href=\"03.01 Reading list/Invisible Man.md\"> Invisible Man </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/Events/2024-03-05 ⚽️ Real Sociedad - PSG (1-2).md\"> 2024-03-05 ⚽️ Real Sociedad - PSG (1-2) </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/The Spy War How the C.I.A. Secretly Helps Ukraine Fight Putin.md\"> The Spy War How the C.I.A. Secretly Helps Ukraine Fight Putin </a>",
"<a class=\"internal-link\" href=\"00.03 News/The Spy War How the C.I.A. Secretly Helps Ukraine Fight Putin.md\"> The Spy War How the C.I.A. Secretly Helps Ukraine Fight Putin </a>",
"<a class=\"internal-link\" href=\"00.03 News/The Pentagons Silicon Valley Problem, by Andrew Cockburn.md\"> The Pentagons Silicon Valley Problem, by Andrew Cockburn </a>",
"<a class=\"internal-link\" href=\"00.03 News/The Great Pretenders How two faux-Inuit sisters cashed in on a life of deception.md\"> The Great Pretenders How two faux-Inuit sisters cashed in on a life of deception </a>",
"<a class=\"internal-link\" href=\"00.03 News/I always believed my funny, kind father was killed by a murderous teenage gang. Three decades on, I discovered the truth.md\"> I always believed my funny, kind father was killed by a murderous teenage gang. Three decades on, I discovered the truth </a>",
"<a class=\"internal-link\" href=\"00.03 News/The (Many) Vintages of the Century.md\"> The (Many) Vintages of the Century </a>",
"<a class=\"internal-link\" href=\"00.03 News/How Russian Spies Get Flipped or Expelled, As Told by a Spycatcher.md\"> How Russian Spies Get Flipped or Expelled, As Told by a Spycatcher </a>",
"<a class=\"internal-link\" href=\"00.03 News/How Russian Spies Get Flipped or Expelled, As Told by a Spycatcher - VSquare.org.md\"> How Russian Spies Get Flipped or Expelled, As Told by a Spycatcher - VSquare.org </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/Events/2024-03-01 ⚽️ AS Monaco - PSG (0-0).md\"> 2024-03-01 ⚽️ AS Monaco - PSG (0-0) </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/La Louisiane.md\"> La Louisiane </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/La Louisiane 1.md\"> La Louisiane 1 </a>",
@ -11740,20 +11811,14 @@
"<a class=\"internal-link\" href=\"00.03 News/Ripples of hate.md\"> Ripples of hate </a>",
"<a class=\"internal-link\" href=\"00.03 News/Hippy, capitalist, guru, grocer the forgotten genius who changed British food.md\"> Hippy, capitalist, guru, grocer the forgotten genius who changed British food </a>",
"<a class=\"internal-link\" href=\"00.03 News/Fentanyl, the portrait of a mass murderer.md\"> Fentanyl, the portrait of a mass murderer </a>",
"<a class=\"internal-link\" href=\"00.03 News/The Taylor Swift deepfakes are a warning.md\"> The Taylor Swift deepfakes are a warning </a>",
"<a class=\"internal-link\" href=\"00.03 News/The Juror Who Found Herself Guilty.md\"> The Juror Who Found Herself Guilty </a>",
"<a class=\"internal-link\" href=\"03.05 Vinyls/Highway to Hell (by ACDC - 1979).md\"> Highway to Hell (by ACDC - 1979) </a>",
"<a class=\"internal-link\" href=\"03.05 Vinyls/Enter the WuTang (36 Chambers) (by WuTang Clan - 1993).md\"> Enter the WuTang (36 Chambers) (by WuTang Clan - 1993) </a>",
"<a class=\"internal-link\" href=\"03.05 Vinyls/Thriller (by Michael Jackson - 1982).md\"> Thriller (by Michael Jackson - 1982) </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Barfussbar.md\"> Barfussbar </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/Old Crow.md\"> Old Crow </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/The Old Crow.md\"> The Old Crow </a>",
"<a class=\"internal-link\" href=\"03.04 Cinematheque/Interview with the Vampire - The Vampire Chronicles (1994).md\"> Interview with the Vampire - The Vampire Chronicles (1994) </a>",
"<a class=\"internal-link\" href=\"03.04 Cinematheque/Rain Man (1988).md\"> Rain Man (1988) </a>",
"<a class=\"internal-link\" href=\"00.03 News/Inside the house shows that bolster Bostons lacking nightlife.md\"> Inside the house shows that bolster Bostons lacking nightlife </a>",
"<a class=\"internal-link\" href=\"00.03 News/Hvaldimir, the Whale Who Went AWOL.md\"> Hvaldimir, the Whale Who Went AWOL </a>"
"<a class=\"internal-link\" href=\"00.03 News/The Taylor Swift deepfakes are a warning.md\"> The Taylor Swift deepfakes are a warning </a>"
],
"Tagged": [
"<a class=\"internal-link\" href=\"00.03 News/I always believed my funny, kind father was killed by a murderous teenage gang. Three decades on, I discovered the truth.md\"> I always believed my funny, kind father was killed by a murderous teenage gang. Three decades on, I discovered the truth </a>",
"<a class=\"internal-link\" href=\"00.03 News/The Great Pretenders How two faux-Inuit sisters cashed in on a life of deception.md\"> The Great Pretenders How two faux-Inuit sisters cashed in on a life of deception </a>",
"<a class=\"internal-link\" href=\"00.03 News/The Pentagons Silicon Valley Problem, by Andrew Cockburn.md\"> The Pentagons Silicon Valley Problem, by Andrew Cockburn </a>",
"<a class=\"internal-link\" href=\"00.03 News/How Russian Spies Get Flipped or Expelled, As Told by a Spycatcher.md\"> How Russian Spies Get Flipped or Expelled, As Told by a Spycatcher </a>",
"<a class=\"internal-link\" href=\"00.03 News/The (Many) Vintages of the Century.md\"> The (Many) Vintages of the Century </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/Invisible Man.md\"> Invisible Man </a>",
"<a class=\"internal-link\" href=\"00.03 News/The surreal life of a professional bridesmaid - The Hustle.md\"> The surreal life of a professional bridesmaid - The Hustle </a>",
"<a class=\"internal-link\" href=\"00.03 News/How a Con Man Ended Up in Solitary in Colorado Supermax Federal Prison.md\"> How a Con Man Ended Up in Solitary in Colorado Supermax Federal Prison </a>",
@ -11799,14 +11864,10 @@
"<a class=\"internal-link\" href=\"00.02 Inbox/Barfussbar.md\"> Barfussbar </a>",
"<a class=\"internal-link\" href=\"02.03 Zürich/The Old Crow.md\"> The Old Crow </a>",
"<a class=\"internal-link\" href=\"00.03 News/Inside the house shows that bolster Bostons lacking nightlife.md\"> Inside the house shows that bolster Bostons lacking nightlife </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/Hvaldimir, the Whale Who Went AWOL.md\"> Hvaldimir, the Whale Who Went AWOL </a>",
"<a class=\"internal-link\" href=\"00.03 News/My cousin was killed by a car bomb in Milwaukee. A mob boss was the top suspect. Now, Im looking for answers..md\"> My cousin was killed by a car bomb in Milwaukee. A mob boss was the top suspect. Now, Im looking for answers. </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/Klewenalp.md\"> Klewenalp </a>",
"<a class=\"internal-link\" href=\"03.02 Travels/Hoch Ybrig.md\"> Hoch Ybrig </a>",
"<a class=\"internal-link\" href=\"03.02 Travels/Hoch Ybrig.md\"> Hoch Ybrig </a>",
"<a class=\"internal-link\" href=\"03.02 Travels/Hoch Ybrig.md\"> Hoch Ybrig </a>"
"<a class=\"internal-link\" href=\"00.02 Inbox/Hvaldimir, the Whale Who Went AWOL.md\"> Hvaldimir, the Whale Who Went AWOL </a>"
],
"Refactored": [
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-03-10.md\"> 2024-03-10 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/Events/2024-03-01 ⚽️ AS Monaco - PSG.md\"> 2024-03-01 ⚽️ AS Monaco - PSG </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-02-25.md\"> 2024-02-25 </a>",
"<a class=\"internal-link\" href=\"03.03 Food & Wine/Sesame Seared Tuna Steak.md\"> Sesame Seared Tuna Steak </a>",
@ -11856,10 +11917,10 @@
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-11-02.md\"> 2023-11-02 </a>",
"<a class=\"internal-link\" href=\"01.02 Home/Real Estate.md\"> Real Estate </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2023-10-26.md\"> 2023-10-26 </a>",
"<a class=\"internal-link\" href=\"00.03 News/Rape, Race and a Decades-Old Lie That Still Wounds.md\"> Rape, Race and a Decades-Old Lie That Still Wounds </a>",
"<a class=\"internal-link\" href=\"00.03 News/A crumbling, long-forgotten statue with an unusual erect phallus might be a Michelangelo. Renaissance scholars want hard evidence..md\"> A crumbling, long-forgotten statue with an unusual erect phallus might be a Michelangelo. Renaissance scholars want hard evidence. </a>"
"<a class=\"internal-link\" href=\"00.03 News/Rape, Race and a Decades-Old Lie That Still Wounds.md\"> Rape, Race and a Decades-Old Lie That Still Wounds </a>"
],
"Deleted": [
"<a class=\"internal-link\" href=\"00.02 Inbox/The Spy War How the C.I.A. Secretly Helps Ukraine Fight Putin.md\"> The Spy War How the C.I.A. Secretly Helps Ukraine Fight Putin </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/When the Border Crisis Is in Your Backyard Migrants, Cartels and Cowboys.md\"> When the Border Crisis Is in Your Backyard Migrants, Cartels and Cowboys </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/As a Son Risks His Life to Topple the King, His Father Guards the Throne.md\"> As a Son Risks His Life to Topple the King, His Father Guards the Throne </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/The Untold Origin Story of ESPN.md\"> The Untold Origin Story of ESPN </a>",
@ -11909,10 +11970,37 @@
"<a class=\"internal-link\" href=\"00.03 News/Trumps Kevin McCarthy could soon be speaker of the House - Los Angeles Times.md\"> Trumps Kevin McCarthy could soon be speaker of the House - Los Angeles Times </a>",
"<a class=\"internal-link\" href=\"00.03 News/The Most Lawless County in Texas.md\"> The Most Lawless County in Texas </a>",
"<a class=\"internal-link\" href=\"00.03 News/How Ukrainians Are Protecting Their Centuries-Old Culture From Putins Invasion.md\"> How Ukrainians Are Protecting Their Centuries-Old Culture From Putins Invasion </a>",
"<a class=\"internal-link\" href=\"00.03 News/Do We Have the History of Native Americans Backward.md\"> Do We Have the History of Native Americans Backward </a>",
"<a class=\"internal-link\" href=\"00.03 News/The Too-Muchness of Bono.md\"> The Too-Muchness of Bono </a>"
"<a class=\"internal-link\" href=\"00.03 News/Do We Have the History of Native Americans Backward.md\"> Do We Have the History of Native Americans Backward </a>"
],
"Linked": [
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-03-10.md\"> 2024-03-10 </a>",
"<a class=\"internal-link\" href=\"00.03 News/The (Many) Vintages of the Century.md\"> The (Many) Vintages of the Century </a>",
"<a class=\"internal-link\" href=\"03.01 Reading list/Yoga.md\"> Yoga </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-03-09.md\"> 2024-03-09 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-03-09.md\"> 2024-03-09 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-03-09.md\"> 2024-03-09 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-03-08.md\"> 2024-03-08 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-03-07.md\"> 2024-03-07 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-03-08.md\"> 2024-03-08 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-03-07.md\"> 2024-03-07 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-03-07.md\"> 2024-03-07 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-03-06.md\"> 2024-03-06 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-03-06.md\"> 2024-03-06 </a>",
"<a class=\"internal-link\" href=\"03.01 Reading list/Invisible Man.md\"> Invisible Man </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-03-06.md\"> 2024-03-06 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-03-06.md\"> 2024-03-06 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-03-05.md\"> 2024-03-05 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-03-05.md\"> 2024-03-05 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-03-05.md\"> 2024-03-05 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-03-04.md\"> 2024-03-04 </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/The Spy War How the C.I.A. Secretly Helps Ukraine Fight Putin.md\"> The Spy War How the C.I.A. Secretly Helps Ukraine Fight Putin </a>",
"<a class=\"internal-link\" href=\"00.03 News/The Great Pretenders How two faux-Inuit sisters cashed in on a life of deception.md\"> The Great Pretenders How two faux-Inuit sisters cashed in on a life of deception </a>",
"<a class=\"internal-link\" href=\"00.03 News/The Pentagons Silicon Valley Problem, by Andrew Cockburn.md\"> The Pentagons Silicon Valley Problem, by Andrew Cockburn </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/I always believed my funny, kind father was killed by a murderous teenage gang. Three decades on, I discovered the truth.md\"> I always believed my funny, kind father was killed by a murderous teenage gang. Three decades on, I discovered the truth </a>",
"<a class=\"internal-link\" href=\"00.03 News/How Russian Spies Get Flipped or Expelled, As Told by a Spycatcher.md\"> How Russian Spies Get Flipped or Expelled, As Told by a Spycatcher </a>",
"<a class=\"internal-link\" href=\"00.03 News/The (Many) Vintages of the Century.md\"> The (Many) Vintages of the Century </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-03-04.md\"> 2024-03-04 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-03-03.md\"> 2024-03-03 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-03-02.md\"> 2024-03-02 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-03-03.md\"> 2024-03-03 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-03-02.md\"> 2024-03-02 </a>",
@ -11935,35 +12023,7 @@
"<a class=\"internal-link\" href=\"03.01 Reading list/Zoo Station.md\"> Zoo Station </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/Invisible Man.md\"> Invisible Man </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-02-26.md\"> 2024-02-26 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-02-26.md\"> 2024-02-26 </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/As a Son Risks His Life to Topple the King, His Father Guards the Throne.md\"> As a Son Risks His Life to Topple the King, His Father Guards the Throne </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/How a Con Man Ended Up in Solitary in Colorado Supermax Federal Prison.md\"> How a Con Man Ended Up in Solitary in Colorado Supermax Federal Prison </a>",
"<a class=\"internal-link\" href=\"00.03 News/Recovering the Lost Aviators of World War II.md\"> Recovering the Lost Aviators of World War II </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-02-25.md\"> 2024-02-25 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-02-25.md\"> 2024-02-25 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-02-25.md\"> 2024-02-25 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-02-24.md\"> 2024-02-24 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-02-24.md\"> 2024-02-24 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-02-23.md\"> 2024-02-23 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-02-23.md\"> 2024-02-23 </a>",
"<a class=\"internal-link\" href=\"00.03 News/The art of doing nothing have the Dutch found the answer to burnout culture.md\"> The art of doing nothing have the Dutch found the answer to burnout culture </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/Sesame Seared Tuna Steak.md\"> Sesame Seared Tuna Steak </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/Sesame Seared Tuna Steak Recipe.md\"> Sesame Seared Tuna Steak Recipe </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-02-22.md\"> 2024-02-22 </a>",
"<a class=\"internal-link\" href=\"03.01 Reading list/Seven Pillars of Wisdom.md\"> Seven Pillars of Wisdom </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-02-22.md\"> 2024-02-22 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-02-21.md\"> 2024-02-21 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-02-22.md\"> 2024-02-22 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-02-22.md\"> 2024-02-22 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-02-21.md\"> 2024-02-21 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-02-20.md\"> 2024-02-20 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-02-20.md\"> 2024-02-20 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-02-19.md\"> 2024-02-19 </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-02-19.md\"> 2024-02-19 </a>",
"<a class=\"internal-link\" href=\"00.03 News/The rise and fall of robots.txt.md\"> The rise and fall of robots.txt </a>",
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-02-19.md\"> 2024-02-19 </a>",
"<a class=\"internal-link\" href=\"00.03 News/In the Land of the Very Old.md\"> In the Land of the Very Old </a>",
"<a class=\"internal-link\" href=\"00.02 Inbox/The surreal life of a professional bridesmaid - The Hustle.md\"> The surreal life of a professional bridesmaid - The Hustle </a>"
"<a class=\"internal-link\" href=\"00.01 Admin/Calendars/2024-02-26.md\"> 2024-02-26 </a>"
],
"Removed Tags from": [
"<a class=\"internal-link\" href=\"03.04 Cinematheque/@Cinematheque.md\"> @Cinematheque </a>",

File diff suppressed because one or more lines are too long

@ -1,8 +1,8 @@
{
"id": "obsidian-map-view",
"name": "Map View",
"version": "4.0.0",
"minAppVersion": "0.15.3",
"version": "5.0.1",
"minAppVersion": "1.5.6",
"description": "An interactive map view.",
"isDesktopOnly": false
}

@ -2,12 +2,17 @@
color: var(--text-normal);
font-size: var(--font-text-size);
font-family: var(--font-text);
font-weight: bold;
margin: 0 !important;
/* Make sure the marker name doesn't cover up the close button */
margin-right: 18px !important;
}
.map-view-marker-sub-name {
color: var(--text-normal);
font-size: var(--font-text-size);
font-family: var(--font-text);
margin: 0 !important;
}
.map-view-main {
@ -92,6 +97,10 @@ a.mv-icon-button.on {
margin-right: 0;
}
.setting-item-control .mv-emoji-icon {
margin: 12px 0;
}
.leaflet-container .dark-mode {
filter: brightness(0.6) invert(1) contrast(3) hue-rotate(200deg)
saturate(0.3) brightness(0.7);
@ -121,12 +130,18 @@ a.mv-icon-button.on {
border-radius: 6px;
line-height: 1.5;
background-color: var(--background-primary);
align-items: center;
}
.clusterPreviewContainer .leaflet-marker-icon {
background-color: var(--background-primary);
}
/* Make emoji icons behave in cluster previews */
.clusterPreviewContainer p {
margin: 10px 0 !important;
}
.graph-control-follow-label {
vertical-align: top;
padding-left: 5px;
@ -142,6 +157,10 @@ a.mv-icon-button.on {
box-shadow: 0 2px 8px var(--background-modifier-box-shadow);
}
.mv-marker-label {
padding: 2px 6px;
}
/* Disable the default Leaflet shadow because we use the Obsidian theme above */
.marker-popup .leaflet-popup-content-wrapper {
box-shadow: none;
@ -149,6 +168,35 @@ a.mv-icon-button.on {
color: none;
}
.mv-marker-popup-container {
max-height: 20em;
width: 30em;
overflow: hidden;
/* Initially this isn't displayed */
display: none;
z-index: 2;
box-shadow: 0px 4px 20px rgba(0, 0, 0, 0.5);
}
.mv-marker-popup-container .markdown-embed {
border-left: 0;
max-height: 200px;
overflow-y: auto;
}
/* Simple placement mode is used on mobile, where the screen is too small and Popper is unavailable anyway */
.mv-marker-popup-container.simple-placement {
bottom: 32px;
position: absolute;
width: 100%;
}
.mv-marker-popup-close {
position: absolute;
top: 10px;
right: 10px;
cursor: pointer;
background: transparent !important;
}
.url-rule-dropdown {
max-width: 7em;
}
@ -165,6 +213,12 @@ a.mv-icon-button.on {
display: flex;
}
.suggestion-item .search-icon-div .leaflet-marker-icon .mv-emoji-icon {
position: relative;
margin: 0;
top: 10px;
}
.search-text-div {
display: flex;
align-items: center;
@ -179,6 +233,15 @@ a.mv-icon-button.on {
filter: drop-shadow(0 0 10px blue);
}
.mv-fade-active .leaflet-marker-icon:not(.mv-fade-marker-shown) {
filter: grayscale(100%);
opacity: 0.5;
}
.mv-fade-active path.leaflet-interactive:not(.mv-fade-edge-shown) {
opacity: 0.1;
}
div.map-view-highlight.marker-cluster {
box-shadow: 0 0 5px blue;
}
@ -189,6 +252,13 @@ div.map-view-highlight.marker-cluster {
height: 15px;
}
.mv-emoji-icon {
text-shadow: 0 0 1px #fff, -1px -1px 1px #fff, 1px -1px 1px #fff,
-1px 1px 1px #fff, 0 0 2px #fff;
top: -2px;
position: relative;
}
.mv-map-control {
margin: 1px;
}
@ -233,3 +303,22 @@ div.map-view-highlight.marker-cluster {
width: 100%;
height: 100%;
}
.mv-simple-circle-marker {
color: white;
border: none;
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
width: 30px;
height: 30px;
}
.mv-simple-circle-marker i {
font-size: 20px;
}
.mv-simple-circle-marker .mv-emoji-icon {
top: 0;
}

@ -41,15 +41,15 @@
}
],
"05.02 Networks/Server Cloud.md": [
{
"title": ":cloud: [[Server Cloud]]: Backup server %%done_del%%",
"time": "2024-03-05",
"rowNumber": 279
},
{
"title": ":cloud: [[Selfhosting]], [[Server Cloud|Cloud]]: Upgrader & Health checks %%done_del%%",
"time": "2024-05-01",
"rowNumber": 283
"rowNumber": 284
},
{
"title": ":cloud: [[Server Cloud]]: Backup server %%done_del%%",
"time": "2024-09-03",
"rowNumber": 279
}
],
"05.02 Networks/Server Alias.md": [
@ -60,7 +60,7 @@
},
{
"title": ":email: [[Server Alias]]: Backup server %%done_del%%",
"time": "2024-03-05",
"time": "2024-09-03",
"rowNumber": 345
}
],
@ -332,16 +332,6 @@
}
],
"01.02 Home/Household.md": [
{
"title": "♻ [[Household]]: *Cardboard* recycling collection %%done_del%%",
"time": "2024-03-05",
"rowNumber": 81
},
{
"title": "🛎 🧻 REMINDER [[Household]]: check need for toilet paper %%done_del%%",
"time": "2024-03-11",
"rowNumber": 96
},
{
"title": "♻ [[Household]]: *Paper* recycling collection %%done_del%%",
"time": "2024-03-12",
@ -350,32 +340,42 @@
{
"title": ":bed: [[Household]] Change bedsheets %%done_del%%",
"time": "2024-03-16",
"rowNumber": 108
"rowNumber": 110
},
{
"title": "🛎 🧻 REMINDER [[Household]]: check need for toilet paper %%done_del%%",
"time": "2024-03-18",
"rowNumber": 97
},
{
"title": "♻ [[Household]]: *Cardboard* recycling collection %%done_del%%",
"time": "2024-03-19",
"rowNumber": 81
},
{
"title": "🛎️ :house: [[Household]]: Pay rent %%done_del%%",
"time": "2024-03-31",
"rowNumber": 92
"rowNumber": 93
},
{
"title": ":blue_car: [[Household]]: Change to Summer tyres @ [[Rex Automobile CH]] %%done_del%%",
"time": "2024-04-15",
"rowNumber": 119
"rowNumber": 121
},
{
"title": ":blue_car: [[Household]]: Change to Winter tyres @ [[Rex Automobile CH]] %%done_del%%",
"time": "2024-10-15",
"rowNumber": 120
"rowNumber": 122
},
{
"title": ":ski: [[Household]]: Organise yearly ski servicing ([[Ski Rental Zürich]]) %%done_del%%",
"time": "2024-10-31",
"rowNumber": 127
"rowNumber": 129
},
{
"title": ":blue_car: [[Household]]: Renew [road vignette](https://www.e-vignette.ch/) %%done_del%%",
"time": "2024-12-20",
"rowNumber": 121
"rowNumber": 123
}
],
"01.03 Family/Pia Bousquié.md": [
@ -393,15 +393,15 @@
}
],
"01.01 Life Orga/@Finances.md": [
{
"title": ":heavy_dollar_sign: [[@Finances|Finances]]: update crypto prices within Obsidian %%done_del%%",
"time": "2024-03-12",
"rowNumber": 116
},
{
"title": ":heavy_dollar_sign: [[@Finances|Finances]]: Swiss tax self declaration %%done_del%%",
"time": "2024-03-31",
"rowNumber": 121
"rowNumber": 122
},
{
"title": ":heavy_dollar_sign: [[@Finances|Finances]]: update crypto prices within Obsidian %%done_del%%",
"time": "2024-04-09",
"rowNumber": 116
},
{
"title": ":bar_chart: [[@Finances|Finances]]: Re-establish financial plan for 2024",
@ -416,7 +416,7 @@
{
"title": ":heavy_dollar_sign: [[@Finances|Finances]]: Close yearly accounts %%done_del%%",
"time": "2025-01-07",
"rowNumber": 119
"rowNumber": 120
}
],
"01.01 Life Orga/@Personal projects.md": [
@ -454,27 +454,27 @@
}
],
"06.02 Investments/Crypto Tasks.md": [
{
"title": ":ballot_box_with_ballot: [[Crypto Tasks]]: Vote for [[EOS]] block producers %%done_del%%",
"time": "2024-03-05",
"rowNumber": 72
},
{
"title": ":chart: Check [[Nimbus]] earnings %%done_del%%",
"time": "2024-03-11",
"rowNumber": 87
"rowNumber": 88
},
{
"title": ":ballot_box_with_ballot: [[Crypto Tasks]]: Vote for [[EOS]] block producers %%done_del%%",
"time": "2024-04-02",
"rowNumber": 72
}
],
"05.02 Networks/Configuring UFW.md": [
{
"title": "🖥 [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix %%done_del%%",
"time": "2024-03-09",
"time": "2024-03-16",
"rowNumber": 239
},
{
"title": "🖥 [[Selfhosting]], [[Configuring UFW|Firewall]]: Update the Blocked IP list %%done_del%%",
"time": "2024-03-09",
"rowNumber": 299
"time": "2024-03-16",
"rowNumber": 300
}
],
"01.03 Family/Amélie Solanet.md": [
@ -529,7 +529,7 @@
"00.08 Bookmarks/Bookmarks - Mac applications.md": [
{
"title": ":label: [[Bookmarks - Mac applications]]: review bookmarks %%done_del%%",
"time": "2024-03-09",
"time": "2024-06-09",
"rowNumber": 104
}
],
@ -555,11 +555,6 @@
}
],
"02.02 Paris/@@Paris.md": [
{
"title": ":sunny: :sports_medal:[[@@Paris|:test_grandes_armes_de_paris:]]: Check out [RG](https://www.rolandgarros.com/fr-fr/page/billetterie-roland-garros)",
"time": "2024-03-10",
"rowNumber": 105
},
{
"title": "🎭:frame_with_picture: [[@@Paris|:test_grandes_armes_de_paris:]]: Check out [exhibitions](https://www.offi.fr/expositions-musees/programme.html) %%done_del%%",
"time": "2024-04-30",
@ -568,7 +563,7 @@
{
"title": ":sunny: :racehorse: [[@@Paris|:test_grandes_armes_de_paris:]]: Check out the [Open de France](https://www.poloclubchantilly.com/)",
"time": "2024-08-25",
"rowNumber": 106
"rowNumber": 107
},
{
"title": ":maple_leaf: :partying_face: [[@@Paris|:test_grandes_armes_de_paris:]]: Fête des Puces %%done_del%%",
@ -578,12 +573,17 @@
{
"title": ":birthday: **Virginie Parent**, [[@@Paris|Paris]] %%done_del%%",
"time": "2024-12-12",
"rowNumber": 147
"rowNumber": 148
},
{
"title": ":snowflake: :sports_medal:[[@@Paris|:test_grandes_armes_de_paris:]]: Check out the [6 Nations](https://billetterie.ffr.fr/fr)",
"time": "2025-01-30",
"rowNumber": 103
},
{
"title": ":sunny: :sports_medal:[[@@Paris|:test_grandes_armes_de_paris:]]: Check out [RG](https://www.rolandgarros.com/fr-fr/page/billetterie-roland-garros)",
"time": "2025-03-10",
"rowNumber": 105
}
],
"00.01 Admin/Calendars/2022-08-26.md": [
@ -685,16 +685,16 @@
}
],
"01.07 Animals/@Sally.md": [
{
"title": ":racehorse: [[@Sally|Sally]]: Pay for horseshoes (150 CHF) %%done_del%%",
"time": "2024-03-10",
"rowNumber": 141
},
{
"title": ":racehorse: [[@Sally|Sally]]: Vet check %%done_del%%",
"time": "2024-03-30",
"rowNumber": 136
},
{
"title": ":racehorse: [[@Sally|Sally]]: Pay for horseshoes (150 CHF) %%done_del%%",
"time": "2024-04-10",
"rowNumber": 141
},
{
"title": ":racehorse: [[@Sally|Sally]]: EHV-1 vaccination dose %%done_del%%",
"time": "2025-01-31",
@ -1010,6 +1010,33 @@
"time": "2024-03-20",
"rowNumber": 104
}
],
"00.01 Admin/Calendars/2024-03-08.md": [
{
"title": "19:26 :chair: [[Household]]: Reprendre la recherche de table a manger demi-lune",
"time": "2024-10-15",
"rowNumber": 103
},
{
"title": "19:27 :diya_lamp: [[Household]]: Reprendre la recherche de lampe bouillotte",
"time": "2024-10-20",
"rowNumber": 105
},
{
"title": "19:28 :test_rl: [[Household]]: Reprendre la recherche de deco liée au polo",
"time": "2024-10-25",
"rowNumber": 106
},
{
"title": "19:26 :horse: [[Household]]: Reprendre la recherche de statue de cheval",
"time": "2024-10-30",
"rowNumber": 104
},
{
"title": "20:47 :couch_and_lamp: [[Household]]: Reprendre la recherche de lampadaires",
"time": "2024-11-05",
"rowNumber": 107
}
]
},
"debug": false,

File diff suppressed because one or more lines are too long

@ -1,7 +1,7 @@
{
"id": "obsidian-tasks-plugin",
"name": "Tasks",
"version": "6.0.0",
"version": "6.1.1",
"minAppVersion": "1.1.1",
"description": "Task management for Obsidian",
"helpUrl": "https://publish.obsidian.md/tasks/",

@ -55,6 +55,9 @@ ul.contains-task-list .task-list-item-checkbox {
cursor: pointer;
font-family: var(--font-interface);
color: var(--text-accent);
user-select: none;
-webkit-user-select: none;
-webkit-touch-callout: none;
}
a.tasks-edit, a.tasks-postpone {
@ -96,6 +99,10 @@ a.tasks-edit, a.tasks-postpone {
white-space: nowrap;
}
.task-list-item-checkbox {
cursor: pointer;
}
/* Hide tags that Obsidian recognises, if `hide tags` instruction was used. */
.tasks-layout-hide-tags .task-description a.tag {
display: none;
@ -117,7 +124,7 @@ a.tasks-edit, a.tasks-postpone {
*------------------------------------------------------------------------**/
.tasks-modal-section + .tasks-modal-section {
margin-top: 16px;
margin-top: 8px;
}
.tasks-modal-section label {
@ -161,6 +168,11 @@ a.tasks-edit, a.tasks-postpone {
resize: vertical;
}
.tasks-modal hr {
margin: 0.35rem 0;
padding-bottom: 0.5rem;
}
.tasks-modal-priorities {
display: grid;
grid-template-columns: 4em 8em 8em 8em;
@ -205,12 +217,12 @@ a.tasks-edit, a.tasks-postpone {
margin-top: 6px;
}
.tasks-modal-dates > input, .tasks-modal-dates > code {
.tasks-modal-dates > .input, .tasks-modal-dates > .results {
grid-column: 2;
align-items: stretch;
}
.tasks-modal-dates > code {
.tasks-modal-dates > .results {
margin-bottom: 5px;
}
@ -254,7 +266,7 @@ a.tasks-edit, a.tasks-postpone {
.tasks-modal-dates > label {
margin: 0;
}
.tasks-modal-dates > input, .tasks-modal-dates > code {
.tasks-modal-dates > .input, .tasks-modal-dates > .results {
grid-column: 1;
}
.tasks-modal-dates > div {
@ -283,6 +295,92 @@ a.tasks-edit, a.tasks-postpone {
grid-row: 1;
}
}
/* Dependency Styles */
.task-dependencies-container {
padding-bottom: 4px;
padding-top: 4px;
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.task-dependency {
display: inline-flex;
background-color: var(--interactive-normal);
box-shadow: var(--input-shadow);
border-radius: 28px;
padding: 6px 8px 6px 12px;
}
.task-dependency-name {
font-size: 14px;
max-width: 160px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.task-dependency-delete {
padding: 3px;
border-radius: 50%;
margin-left: 6px;
cursor: pointer;
height: inherit;
box-shadow: none !important;
background-color: var(--background-primary) !important;
}
.task-dependency-dropdown {
list-style: none;
position: absolute;
top: 0;
left: 0;
padding: 4px;
margin: 0;
background-color: var(--background-primary);
border: 1px;
border-radius: 6px;
border-color: var(--background-modifier-border);
border-style: solid;
z-index: 99;
max-height: 170px;
overflow-y: auto;
}
.task-dependency-dropdown li {
padding: 5px;
margin: 2px;
border-radius: 6px;
cursor: pointer;
display: flex;
justify-content: space-between
}
.task-dependency-dropdown li .dependency-name {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.task-dependency-dropdown li .dependency-name-shared {
width: calc(60%);
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.task-dependency-dropdown li .dependency-path {
width: calc(40%);
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
font-style: italic;
text-align: right;
color: var(--italic-color)
}
.task-dependency-dropdown li.selected {
background-color: var(--text-selection);
}
/**------------------------------------------------------------------------
** SETTINGS

@ -48,20 +48,57 @@
"devMode": false,
"templateFolderPath": "00.01 Admin/Templates",
"announceUpdates": true,
"version": "1.7.0",
"version": "1.8.1",
"disableOnlineFeatures": true,
"ai": {
"OpenAIApiKey": "",
"defaultModel": "Ask me",
"defaultSystemPrompt": "As an AI assistant within Obsidian, your primary goal is to help users manage their ideas and knowledge more effectively. Format your responses using Markdown syntax. Please use the [[Obsidian]] link format. You can write aliases for the links by writing [[Obsidian|the alias after the pipe symbol]]. To use mathematical notation, use LaTeX syntax. LaTeX syntax for larger equations should be on separate lines, surrounded with double dollar signs ($$). You can also inline math expressions by wrapping it in $ symbols. For example, use $$w_{ij}^{\text{new}}:=w_{ij}^{\text{current}}+etacdotdelta_jcdot x_{ij}$$ on a separate line, but you can write \"($eta$ = learning rate, $delta_j$ = error term, $x_{ij}$ = input)\" inline.",
"promptTemplatesFolderPath": "",
"showAssistant": true
"showAssistant": true,
"providers": [
{
"name": "OpenAI",
"endpoint": "https://api.openai.com/v1",
"apiKey": "",
"models": [
{
"name": "gpt-3.5-turbo",
"maxTokens": 4096
},
{
"name": "gpt-3.5-turbo-16k",
"maxTokens": 16384
},
{
"name": "gpt-3.5-turbo-1106",
"maxTokens": 16385
},
{
"name": "gpt-4",
"maxTokens": 8192
},
{
"name": "gpt-4-32k",
"maxTokens": 32768
},
{
"name": "gpt-4-1106-preview",
"maxTokens": 128000
},
{
"name": "text-davinci-003",
"maxTokens": 4096
}
]
}
]
},
"migrations": {
"migrateToMacroIDFromEmbeddedMacro": true,
"useQuickAddTemplateFolder": true,
"incrementFileNameSettingMoveToDefaultBehavior": true,
"mutualExclusionInsertAfterAndWriteToBottomOfFile": true,
"setVersionAfterUpdateModalRelease": true
"setVersionAfterUpdateModalRelease": true,
"addDefaultAIProviders": true
}
}

@ -147,10 +147,10 @@ __export(main_exports, {
default: () => QuickAdd
});
module.exports = __toCommonJS(main_exports);
var import_obsidian41 = require("obsidian");
var import_obsidian42 = require("obsidian");
// src/quickAddSettingsTab.ts
var import_obsidian33 = require("obsidian");
var import_obsidian34 = require("obsidian");
// node_modules/.pnpm/svelte@3.59.1/node_modules/svelte/internal/index.mjs
function noop() {
@ -11137,26 +11137,6 @@ function encodingForModel(model, extendSpecialTokens) {
// src/ai/OpenAIRequest.ts
var import_obsidian15 = require("obsidian");
// src/ai/getModelMaxTokens.ts
function getModelMaxTokens(model) {
switch (model) {
case "text-davinci-003":
return 4096;
case "gpt-3.5-turbo":
return 4096;
case "gpt-4":
return 8192;
case "gpt-3.5-turbo-16k":
return 16384;
case "gpt-3.5-turbo-1106":
return 16385;
case "gpt-4-1106-preview":
return 128e3;
case "gpt-4-32k":
return 32768;
}
}
// src/ai/preventCursorChange.ts
function preventCursorChange() {
const cursor = app.workspace.activeEditor?.editor?.getCursor();
@ -11169,6 +11149,30 @@ function preventCursorChange() {
};
}
// src/ai/aiHelpers.ts
function getModelNames() {
const aiSettings = settingsStore.getState().ai;
return aiSettings.providers.flatMap((provider) => provider.models).map((model) => model.name);
}
function getModelByName(model) {
const aiSettings = settingsStore.getState().ai;
return aiSettings.providers.flatMap((provider) => provider.models).find((m) => m.name === model);
}
function getModelMaxTokens(model) {
const aiSettings = settingsStore.getState().ai;
const modelData = aiSettings.providers.flatMap((provider) => provider.models).find((m) => m.name === model);
if (modelData) {
return modelData.maxTokens;
}
throw new Error(`Model ${model} not found with any provider.`);
}
function getModelProvider(modelName) {
const aiSettings = settingsStore.getState().ai;
return aiSettings.providers.find(
(provider) => provider.models.some((m) => m.name === modelName)
);
}
// src/ai/OpenAIRequest.ts
function OpenAIRequest(apiKey, model, systemPrompt, modelParams = {}) {
return async function makeRequest(prompt) {
@ -11178,23 +11182,27 @@ function OpenAIRequest(apiKey, model, systemPrompt, modelParams = {}) {
);
}
const tokenCount = getTokenCount(prompt, model) + getTokenCount(systemPrompt, model);
const maxTokens = getModelMaxTokens(model);
const { maxTokens } = model;
if (tokenCount > maxTokens) {
throw new Error(
`The ${model} API has a token limit of ${maxTokens}. Your prompt has ${tokenCount} tokens.`
`The ${model.name} API has a token limit of ${maxTokens}. Your prompt has ${tokenCount} tokens.`
);
}
const modelProvider = getModelProvider(model.name);
if (!modelProvider) {
throw new Error(`Model ${model.name} not found with any provider.`);
}
try {
const restoreCursor = preventCursorChange();
const _response = (0, import_obsidian15.requestUrl)({
url: `https://api.openai.com/v1/chat/completions`,
url: `${modelProvider.endpoint}/chat/completions`,
method: "POST",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${apiKey}`
},
body: JSON.stringify({
model,
model: model.name,
...modelParams,
messages: [
{ role: "system", content: systemPrompt },
@ -11208,7 +11216,7 @@ function OpenAIRequest(apiKey, model, systemPrompt, modelParams = {}) {
} catch (error) {
console.log(error);
throw new Error(
`Error while making request to OpenAI API: ${error.message}`
`Error while making request to ${modelProvider.name}: ${error.message}`
);
}
};
@ -11240,10 +11248,15 @@ function makeNoticeHandler(showMessages) {
// src/ai/AIAssistant.ts
var getTokenCount = (text2, model) => {
let m = model === "gpt-3.5-turbo-16k" ? "gpt-3.5-turbo" : model;
let m = model.name === "gpt-3.5-turbo-16k" ? "gpt-3.5-turbo" : model.name;
m = m === "gpt-4-1106-preview" ? "gpt-4" : m;
m = m === "gpt-3.5-turbo-1106" ? "gpt-3.5-turbo" : m;
try {
return encodingForModel(m).encode(text2).length;
} catch {
const enc = getEncoding("cl100k_base");
return enc.encode(text2).length;
}
};
async function repeatUntilResolved(callback, promise, interval) {
if (typeof callback !== "function") {
@ -11499,7 +11512,7 @@ async function ChunkedPrompt(settings, formatter) {
renderedPromptTemplate,
model
);
const maxChunkTokenSize = getModelMaxTokens(model) / 2 - systemPromptLength;
const maxChunkTokenSize = getModelMaxTokens(model.name) / 2 - systemPromptLength;
const shouldMerge = settings.shouldMerge ?? true;
const chunkedPrompts = [];
const maxCombinedChunkSize = maxChunkTokenSize - promptTemplateTokenCount;
@ -11511,7 +11524,10 @@ async function ChunkedPrompt(settings, formatter) {
const strSize = getTokenCount(chunk, model) + 1;
if (strSize > maxCombinedChunkSize) {
throw new Error(
`The chunk "${chunk.slice(0, 25)}..." is too large to fit in a single prompt.`
`The chunk "${chunk.slice(
0,
25
)}..." is too large to fit in a single prompt.`
);
}
if (combinedChunkSize + strSize < maxCombinedChunkSize) {
@ -11594,10 +11610,6 @@ async function ChunkedPrompt(settings, formatter) {
}
}
// src/ai/models.ts
var models = ["gpt-3.5-turbo", "gpt-3.5-turbo-16k", "gpt-3.5-turbo-1106", "gpt-4", "gpt-4-1106-preview", "gpt-4-32k", "text-davinci-003"];
var models_and_ask_me = [...models, "Ask me"];
// src/quickAddApi.ts
var QuickAddApi = class {
static GetApi(app2, plugin, choiceExecutor) {
@ -11662,11 +11674,17 @@ var QuickAddApi = class {
plugin,
choiceExecutor
).format;
const modelProvider = getModelProvider(model.name);
if (!modelProvider) {
throw new Error(
`Model '${model.name}' not found in any provider`
);
}
const assistantRes = await Prompt(
{
model,
prompt,
apiKey: AISettings.OpenAIApiKey,
apiKey: modelProvider.apiKey,
modelOptions: settings?.modelOptions ?? {},
outputVariableName: settings?.variableName ?? "output",
showAssistantMessages: settings?.showAssistantMessages ?? true,
@ -11698,13 +11716,28 @@ var QuickAddApi = class {
plugin,
choiceExecutor
).format;
const _model = getModelByName(model);
if (!_model) {
throw new Error(`Model ${model} not found.`);
}
const modelProvider = getModelProvider(model);
if (!modelProvider) {
throw new Error(
`Model '${_model.name}' not found in any provider`
);
}
if (!modelProvider.apiKey) {
throw new Error(
`Model '${_model.name}' requires an API key`
);
}
const assistantRes = await ChunkedPrompt(
{
model,
model: _model,
text: text2,
promptTemplate,
chunkSeparator: settings?.chunkSeparator ?? /\n/,
apiKey: AISettings.OpenAIApiKey,
apiKey: modelProvider.apiKey,
modelOptions: settings?.modelOptions ?? {},
outputVariableName: settings?.variableName ?? "output",
showAssistantMessages: settings?.showAssistantMessages ?? true,
@ -11730,10 +11763,14 @@ var QuickAddApi = class {
return assistantRes;
},
getModels: () => {
return models;
return getModelNames();
},
getMaxTokens: (model) => {
return getModelMaxTokens(model);
getMaxTokens: (modelName) => {
const model = getModelByName(modelName);
if (!model) {
throw new Error(`Model ${modelName} not found.`);
}
return model.maxTokens;
},
countTokens(text2, model) {
return getTokenCount(text2, model);
@ -12162,16 +12199,26 @@ ${error.message}`
);
}
const aiSettings = settingsStore.getState().ai;
const options = [...models];
const model = command.model === "Ask me" ? await GenericSuggester.Suggest(app, options, options) : command.model;
const options = getModelNames();
const modelName = command.model === "Ask me" ? await GenericSuggester.Suggest(app, options, options) : command.model;
const model = getModelByName(modelName);
if (!model) {
throw new Error(`Model ${modelName} not found with any provider.`);
}
const formatter = new CompleteFormatter(
app,
QuickAdd.instance,
this.choiceExecutor
);
const modelProvider = getModelProvider(model.name);
if (!modelProvider) {
throw new Error(
`Model ${model.name} not found in the AI providers settings.`
);
}
const aiOutputVariables = await runAIAssistant(
{
apiKey: aiSettings.OpenAIApiKey,
apiKey: modelProvider.apiKey,
model,
outputVariableName: command.outputVariableName,
promptTemplate: command.promptTemplate,
@ -15068,7 +15115,10 @@ var AIAssistantCommandSettingsModal = class extends import_obsidian27.Modal {
get systemPromptTokenLength() {
if (this.settings.model === "Ask me")
return Number.POSITIVE_INFINITY;
return getTokenCount(this.settings.systemPrompt, this.settings.model);
const model = getModelByName(this.settings.model);
if (!model)
return Number.POSITIVE_INFINITY;
return getTokenCount(this.settings.systemPrompt, model);
}
display() {
const header = this.contentEl.createEl("h2", {
@ -15137,9 +15187,11 @@ var AIAssistantCommandSettingsModal = class extends import_obsidian27.Modal {
}
addModelSetting(container) {
new import_obsidian27.Setting(container).setName("Model").setDesc("The model the AI Assistant will use").addDropdown((dropdown) => {
for (const model of models_and_ask_me) {
const models = getModelNames();
for (const model of models) {
dropdown.addOption(model, model);
}
dropdown.addOption("Ask me", "Ask me");
dropdown.setValue(this.settings.model);
dropdown.onChange((value) => {
this.settings.model = value;
@ -16861,8 +16913,211 @@ var MacrosManager = class extends import_obsidian31.Modal {
};
// src/gui/AIAssistantSettingsModal.ts
var import_obsidian33 = require("obsidian");
// src/gui/AIAssistantProvidersModal.ts
var import_obsidian32 = require("obsidian");
var AIAssistantSettingsModal = class extends import_obsidian32.Modal {
var AIAssistantProvidersModal = class extends import_obsidian32.Modal {
constructor(providers, app2) {
super(app2);
this.providers = providers;
this.waitForClose = new Promise((resolve, reject) => {
this.rejectPromise = reject;
this.resolvePromise = resolve;
});
this.open();
this.display();
}
display() {
const modalName = this.selectedProvider ? `${this.selectedProvider.name}` : "Providers";
this.contentEl.createEl("h2", {
text: modalName
}).style.textAlign = "center";
if (this.selectedProvider) {
this.addProviderSetting(this.contentEl);
return;
}
this.addProvidersSetting(this.contentEl);
}
reload() {
this.contentEl.empty();
this.display();
}
addProvidersSetting(container) {
new import_obsidian32.Setting(container).setName("Providers").setDesc("Providers for the AI Assistant").addButton((button) => {
button.setButtonText("Add Provider").onClick(async () => {
const providerName = await GenericInputPrompt.Prompt(
app,
"Provider Name"
);
this.providers.push({
name: providerName,
endpoint: "",
apiKey: "",
models: []
});
this.reload();
});
button.setCta();
});
const providersContainer = container.createDiv("providers-container");
providersContainer.style.display = "flex";
providersContainer.style.flexDirection = "column";
providersContainer.style.gap = "10px";
providersContainer.style.overflowY = "auto";
providersContainer.style.maxHeight = "400px";
providersContainer.style.padding = "10px";
this.providers.forEach((provider, i) => {
new import_obsidian32.Setting(providersContainer).setName(provider.name).setDesc(provider.endpoint).addButton((button) => {
button.onClick(async () => {
const confirmation = await GenericYesNoPrompt.Prompt(
app,
`Are you sure you want to delete ${provider.name}?`
);
if (!confirmation) {
return;
}
this.providers.splice(i, 1);
this.reload();
});
button.setWarning();
button.setIcon("trash");
}).addButton((button) => {
button.setButtonText("Edit").onClick(() => {
this.selectedProvider = provider;
this._selectedProviderClone = structuredClone(provider);
this.reload();
});
});
});
}
addProviderSetting(container) {
this.addNameSetting(container);
this.addEndpointSetting(container);
this.addApiKeySetting(container);
this.addProviderModelsSetting(container);
this.addProviderSettingButtonRow(this.contentEl);
}
addNameSetting(container) {
new import_obsidian32.Setting(container).setName("Name").setDesc("The name of the provider").addText((text2) => {
text2.setValue(this.selectedProvider.name).onChange((value) => {
this.selectedProvider.name = value;
});
});
}
addEndpointSetting(container) {
new import_obsidian32.Setting(container).setName("Endpoint").setDesc("The endpoint for the AI Assistant").addText((text2) => {
text2.setValue(this.selectedProvider.endpoint).onChange(
(value) => {
this.selectedProvider.endpoint = value;
}
);
});
}
addApiKeySetting(container) {
new import_obsidian32.Setting(container).setName("API Key").setDesc("The API Key for the AI Assistant").addText((text2) => {
setPasswordOnBlur(text2.inputEl);
text2.setValue(this.selectedProvider.apiKey).onChange(
(value) => {
this.selectedProvider.apiKey = value;
}
);
});
}
addProviderModelsSetting(container) {
const modelsContainer = container.createDiv("models-container");
modelsContainer.style.display = "flex";
modelsContainer.style.flexDirection = "column";
modelsContainer.style.gap = "10px";
modelsContainer.style.overflowY = "auto";
modelsContainer.style.maxHeight = "400px";
modelsContainer.style.padding = "10px";
this.selectedProvider.models.forEach((model, i) => {
new import_obsidian32.Setting(modelsContainer).setName(model.name).setDesc(`Max Tokens: ${model.maxTokens}`).addButton((button) => {
button.onClick(async () => {
const confirmation = await GenericYesNoPrompt.Prompt(
app,
`Are you sure you want to delete ${model.name}?`
);
if (!confirmation) {
return;
}
this.selectedProvider.models.splice(i, 1);
this.reload();
});
button.setWarning();
button.setIcon("trash");
});
});
new import_obsidian32.Setting(modelsContainer).setName("Add Model").addButton((button) => {
button.setButtonText("Add Model").onClick(async () => {
const modelName = await GenericInputPrompt.Prompt(
app,
"Model Name"
);
const maxTokens = await GenericInputPrompt.Prompt(
app,
"Max Tokens"
);
this.selectedProvider.models.push({
name: modelName,
maxTokens: parseInt(maxTokens)
});
this.reload();
});
button.setCta();
});
}
addProviderSettingButtonRow(container) {
const buttonRow = container.createDiv("button-row");
buttonRow.style.display = "flex";
buttonRow.style.justifyContent = "space-between";
buttonRow.style.marginTop = "20px";
const CancelButton = new import_obsidian32.ButtonComponent(buttonRow);
CancelButton.setButtonText("Cancel");
CancelButton.setWarning();
CancelButton.onClick(() => {
if (!this.selectedProvider || !this._selectedProviderClone)
return;
const noChangesMade = !checkObjectDiff(
this.selectedProvider,
this._selectedProviderClone
);
if (noChangesMade) {
this.selectedProvider = null;
this._selectedProviderClone = null;
this.reload();
return;
}
Object.assign(this.selectedProvider, this._selectedProviderClone);
this.selectedProvider = this._selectedProviderClone;
this._selectedProviderClone = null;
this.close();
});
const SaveButton = new import_obsidian32.ButtonComponent(buttonRow);
SaveButton.setButtonText("Save");
SaveButton.setCta();
SaveButton.onClick(() => {
this.selectedProvider = null;
this.reload();
});
}
onClose() {
if (this.selectedProvider) {
this.selectedProvider = null;
this.reload();
this.open();
}
this.resolvePromise(this.providers);
super.onClose();
}
};
function checkObjectDiff(obj1, obj2) {
return JSON.stringify(obj1) !== JSON.stringify(obj2);
}
// src/gui/AIAssistantSettingsModal.ts
var AIAssistantSettingsModal = class extends import_obsidian33.Modal {
constructor(settings) {
super(app);
this.settings = settings;
@ -16879,7 +17134,7 @@ var AIAssistantSettingsModal = class extends import_obsidian32.Modal {
this.contentEl.createEl("h2", {
text: "AI Assistant Settings"
}).style.textAlign = "center";
this.addApiKeySetting(this.contentEl);
this.addProvidersSetting(this.contentEl);
this.addDefaultModelSetting(this.contentEl);
this.addPromptTemplateFolderPathSetting(this.contentEl);
this.addShowAssistantSetting(this.contentEl);
@ -16889,20 +17144,25 @@ var AIAssistantSettingsModal = class extends import_obsidian32.Modal {
this.contentEl.empty();
this.display();
}
addApiKeySetting(container) {
new import_obsidian32.Setting(container).setName("API Key").setDesc("The API Key for the AI Assistant").addText((text2) => {
setPasswordOnBlur(text2.inputEl);
text2.setValue(this.settings.OpenAIApiKey).onChange((value) => {
this.settings.OpenAIApiKey = value;
addProvidersSetting(container) {
new import_obsidian33.Setting(container).setName("Providers").setDesc("The providers for the AI Assistant").addButton((button) => {
button.setButtonText("Edit Providers").onClick(() => {
void new AIAssistantProvidersModal(
this.settings.providers,
app
).waitForClose.then(() => {
this.reload();
});
});
text2.inputEl.placeholder = "sk-...";
});
}
addDefaultModelSetting(container) {
new import_obsidian32.Setting(container).setName("Default Model").setDesc("The default model for the AI Assistant").addDropdown((dropdown) => {
for (const model of models_and_ask_me) {
new import_obsidian33.Setting(container).setName("Default Model").setDesc("The default model for the AI Assistant").addDropdown((dropdown) => {
const models = getModelNames();
for (const model of models) {
dropdown.addOption(model, model);
}
dropdown.addOption("Ask me", "Ask me");
dropdown.setValue(this.settings.defaultModel);
dropdown.onChange((value) => {
this.settings.defaultModel = value;
@ -16910,7 +17170,7 @@ var AIAssistantSettingsModal = class extends import_obsidian32.Modal {
});
}
addPromptTemplateFolderPathSetting(container) {
new import_obsidian32.Setting(container).setName("Prompt Template Folder Path").setDesc("Path to your folder with prompt templates").addText((text2) => {
new import_obsidian33.Setting(container).setName("Prompt Template Folder Path").setDesc("Path to your folder with prompt templates").addText((text2) => {
text2.setValue(this.settings.promptTemplatesFolderPath).onChange(
(value) => {
this.settings.promptTemplatesFolderPath = value;
@ -16919,7 +17179,7 @@ var AIAssistantSettingsModal = class extends import_obsidian32.Modal {
});
}
addShowAssistantSetting(container) {
new import_obsidian32.Setting(container).setName("Show Assistant").setDesc("Show status messages from the AI Assistant").addToggle((toggle) => {
new import_obsidian33.Setting(container).setName("Show Assistant").setDesc("Show status messages from the AI Assistant").addToggle((toggle) => {
toggle.setValue(this.settings.showAssistant);
toggle.onChange((value) => {
this.settings.showAssistant = value;
@ -16927,8 +17187,8 @@ var AIAssistantSettingsModal = class extends import_obsidian32.Modal {
});
}
addDefaultSystemPromptSetting(contentEl) {
new import_obsidian32.Setting(contentEl).setName("Default System Prompt").setDesc("The default system prompt for the AI Assistant");
const textAreaComponent = new import_obsidian32.TextAreaComponent(contentEl);
new import_obsidian33.Setting(contentEl).setName("Default System Prompt").setDesc("The default system prompt for the AI Assistant");
const textAreaComponent = new import_obsidian33.TextAreaComponent(contentEl);
textAreaComponent.setValue(this.settings.defaultSystemPrompt).onChange(async (value) => {
this.settings.defaultSystemPrompt = value;
formatDisplay.innerText = await displayFormatter.format(value);
@ -17358,6 +17618,46 @@ var ChoiceView = class extends SvelteComponent {
};
var ChoiceView_default = ChoiceView;
// src/ai/Provider.ts
var OpenAIProvider = {
name: "OpenAI",
endpoint: "https://api.openai.com/v1",
apiKey: "",
models: [
{
name: "gpt-3.5-turbo",
maxTokens: 4096
},
{
name: "gpt-3.5-turbo-16k",
maxTokens: 16384
},
{
name: "gpt-3.5-turbo-1106",
maxTokens: 16385
},
{
name: "gpt-4",
maxTokens: 8192
},
{
name: "gpt-4-32k",
maxTokens: 32768
},
{
name: "gpt-4-1106-preview",
maxTokens: 128e3
},
{
name: "text-davinci-003",
maxTokens: 4096
}
]
};
var DefaultProviders = [
OpenAIProvider
];
// src/quickAddSettingsTab.ts
var DEFAULT_SETTINGS = {
choices: [],
@ -17369,21 +17669,22 @@ var DEFAULT_SETTINGS = {
version: "0.0.0",
disableOnlineFeatures: true,
ai: {
OpenAIApiKey: "",
defaultModel: "Ask me",
defaultSystemPrompt: `As an AI assistant within Obsidian, your primary goal is to help users manage their ideas and knowledge more effectively. Format your responses using Markdown syntax. Please use the [[Obsidian]] link format. You can write aliases for the links by writing [[Obsidian|the alias after the pipe symbol]]. To use mathematical notation, use LaTeX syntax. LaTeX syntax for larger equations should be on separate lines, surrounded with double dollar signs ($$). You can also inline math expressions by wrapping it in $ symbols. For example, use $$w_{ij}^{ ext{new}}:=w_{ij}^{ ext{current}}+etacdotdelta_jcdot x_{ij}$$ on a separate line, but you can write "($eta$ = learning rate, $delta_j$ = error term, $x_{ij}$ = input)" inline.`,
promptTemplatesFolderPath: "",
showAssistant: true
showAssistant: true,
providers: DefaultProviders
},
migrations: {
migrateToMacroIDFromEmbeddedMacro: false,
useQuickAddTemplateFolder: false,
incrementFileNameSettingMoveToDefaultBehavior: false,
mutualExclusionInsertAfterAndWriteToBottomOfFile: false,
setVersionAfterUpdateModalRelease: false
setVersionAfterUpdateModalRelease: false,
addDefaultAIProviders: false
}
};
var QuickAddSettingsTab = class extends import_obsidian33.PluginSettingTab {
var QuickAddSettingsTab = class extends import_obsidian34.PluginSettingTab {
constructor(app2, plugin) {
super(app2, plugin);
this.plugin = plugin;
@ -17399,7 +17700,7 @@ var QuickAddSettingsTab = class extends import_obsidian33.PluginSettingTab {
this.addDisableOnlineFeaturesSetting();
}
addAnnounceUpdatesSetting() {
const setting = new import_obsidian33.Setting(this.containerEl);
const setting = new import_obsidian34.Setting(this.containerEl);
setting.setName("Announce Updates");
setting.setDesc(
"Display release notes when a new version is installed. This includes new features, demo videos, and bug fixes."
@ -17416,7 +17717,7 @@ var QuickAddSettingsTab = class extends import_obsidian33.PluginSettingTab {
this.choiceView.$destroy();
}
addChoicesSetting() {
const setting = new import_obsidian33.Setting(this.containerEl);
const setting = new import_obsidian34.Setting(this.containerEl);
setting.infoEl.remove();
setting.settingEl.style.display = "block";
this.choiceView = new ChoiceView_default({
@ -17436,7 +17737,7 @@ var QuickAddSettingsTab = class extends import_obsidian33.PluginSettingTab {
});
}
addUseMultiLineInputPromptSetting() {
new import_obsidian33.Setting(this.containerEl).setName("Use Multi-line Input Prompt").setDesc(
new import_obsidian34.Setting(this.containerEl).setName("Use Multi-line Input Prompt").setDesc(
"Use multi-line input prompt instead of single-line input prompt"
).addToggle(
(toggle) => toggle.setValue(this.plugin.settings.inputPrompt === "multi-line").setTooltip("Use multi-line input prompt").onChange((value) => {
@ -17453,7 +17754,7 @@ var QuickAddSettingsTab = class extends import_obsidian33.PluginSettingTab {
);
}
addTemplateFolderPathSetting() {
const setting = new import_obsidian33.Setting(this.containerEl);
const setting = new import_obsidian34.Setting(this.containerEl);
setting.setName("Template Folder Path");
setting.setDesc(
"Path to the folder where templates are stored. Used to suggest template files when configuring QuickAdd."
@ -17465,12 +17766,12 @@ var QuickAddSettingsTab = class extends import_obsidian33.PluginSettingTab {
new GenericTextSuggester(
app,
text2.inputEl,
app.vault.getAllLoadedFiles().filter((f) => f instanceof import_obsidian33.TFolder && f.path !== "/").map((f) => f.path)
app.vault.getAllLoadedFiles().filter((f) => f instanceof import_obsidian34.TFolder && f.path !== "/").map((f) => f.path)
);
});
}
addDisableOnlineFeaturesSetting() {
new import_obsidian33.Setting(this.containerEl).setName("Disable AI & Online features").setDesc(
new import_obsidian34.Setting(this.containerEl).setName("Disable AI & Online features").setDesc(
"This prevents the plugin from making requests to external providers like OpenAI. You can still use User Scripts to execute arbitrary code, inclulding contacting external providers. However, this setting disables plugin features like the AI Assistant from doing so. You need to disable this setting to use the AI Assistant."
).addToggle(
(toggle) => toggle.setValue(settingsStore.getState().disableOnlineFeatures).onChange((value) => {
@ -17520,7 +17821,7 @@ var ConsoleErrorLogger = class extends QuickAddLogger {
};
// src/logger/guiLogger.ts
var import_obsidian34 = require("obsidian");
var import_obsidian35 = require("obsidian");
var GuiLogger = class extends QuickAddLogger {
constructor(plugin) {
super();
@ -17528,11 +17829,11 @@ var GuiLogger = class extends QuickAddLogger {
}
logError(msg) {
const error = this.getQuickAddError(msg, "ERROR" /* Error */);
new import_obsidian34.Notice(this.formatOutputString(error), 15e3);
new import_obsidian35.Notice(this.formatOutputString(error), 15e3);
}
logWarning(msg) {
const warning = this.getQuickAddError(msg, "WARNING" /* Warning */);
new import_obsidian34.Notice(this.formatOutputString(warning));
new import_obsidian35.Notice(this.formatOutputString(warning));
}
logMessage(msg) {
}
@ -17554,7 +17855,7 @@ var StartupMacroEngine = class extends MacroChoiceEngine {
};
// src/engine/TemplateChoiceEngine.ts
var import_obsidian35 = require("obsidian");
var import_obsidian36 = require("obsidian");
var TemplateChoiceEngine = class extends TemplateEngine {
constructor(app2, plugin, choice, choiceExecutor) {
super(app2, plugin, choiceExecutor);
@ -17588,7 +17889,7 @@ var TemplateChoiceEngine = class extends TemplateEngine {
let createdFile;
if (await this.app.vault.adapter.exists(filePath)) {
const file = this.app.vault.getAbstractFileByPath(filePath);
if (!(file instanceof import_obsidian35.TFile) || file.extension !== "md") {
if (!(file instanceof import_obsidian36.TFile) || file.extension !== "md") {
log.logError(
`'${filePath}' already exists and is not a valid markdown file.`
);
@ -17710,7 +18011,7 @@ var TemplateChoiceEngine = class extends TemplateEngine {
};
// src/formatters/captureChoiceFormatter.ts
var import_obsidian36 = require("obsidian");
var import_obsidian37 = require("obsidian");
// src/formatters/helpers/getEndOfSection.ts
function isSameHeading(heading1, heading2) {
@ -17959,7 +18260,7 @@ ${insertAfterLineAndFormatted}`;
}
if (this.choice.insertAfter?.createIfNotFoundLocation === CREATE_IF_NOT_FOUND_CURSOR) {
try {
const activeView = this.app.workspace.getActiveViewOfType(import_obsidian36.MarkdownView);
const activeView = this.app.workspace.getActiveViewOfType(import_obsidian37.MarkdownView);
if (!activeView) {
throw new Error("No active view.");
}
@ -18850,8 +19151,8 @@ This is in order to prevent data loss.`
};
// src/gui/suggesters/choiceSuggester.ts
var import_obsidian37 = require("obsidian");
var ChoiceSuggester = class extends import_obsidian37.FuzzySuggestModal {
var import_obsidian38 = require("obsidian");
var ChoiceSuggester = class extends import_obsidian38.FuzzySuggestModal {
constructor(plugin, choices, choiceExecutor) {
super(plugin.app);
this.plugin = plugin;
@ -18868,7 +19169,7 @@ var ChoiceSuggester = class extends import_obsidian37.FuzzySuggestModal {
}
renderSuggestion(item, el) {
el.empty();
void import_obsidian37.MarkdownRenderer.renderMarkdown(item.item.name, el, "", this.plugin);
void import_obsidian38.MarkdownRenderer.renderMarkdown(item.item.name, el, "", this.plugin);
el.classList.add("quickadd-choice-suggestion");
}
getItemText(item) {
@ -19152,13 +19453,43 @@ var setVersionAfterUpdateModalRelease = {
};
var setVersionAfterUpdateModalRelease_default = setVersionAfterUpdateModalRelease;
// src/migrations/addDefaultAIProviders.ts
var addDefaultAIProviders = {
description: "Add default AI providers to the settings.",
// eslint-disable-next-line @typescript-eslint/require-await
migrate: async (_) => {
const ai = settingsStore.getState().ai;
const defaultProvidersWithOpenAIKey = DefaultProviders.map(
(provider) => {
if (provider.name === "OpenAI") {
if ("OpenAIApiKey" in ai && typeof ai.OpenAIApiKey === "string") {
provider.apiKey = ai.OpenAIApiKey;
}
}
return provider;
}
);
if ("OpenAIApiKey" in ai) {
delete ai.OpenAIApiKey;
}
settingsStore.setState({
ai: {
...settingsStore.getState().ai,
providers: defaultProvidersWithOpenAIKey
}
});
}
};
var addDefaultAIProviders_default = addDefaultAIProviders;
// src/migrations/migrate.ts
var migrations = {
migrateToMacroIDFromEmbeddedMacro: migrateToMacroIDFromEmbeddedMacro_default,
useQuickAddTemplateFolder: useQuickAddTemplateFolder_default,
incrementFileNameSettingMoveToDefaultBehavior: incrementFileNameSettingMoveToDefaultBehavior_default,
mutualExclusionInsertAfterAndWriteToBottomOfFile: mutualExclusionInsertAfterAndWriteToBottomOfFile_default,
setVersionAfterUpdateModalRelease: setVersionAfterUpdateModalRelease_default
setVersionAfterUpdateModalRelease: setVersionAfterUpdateModalRelease_default,
addDefaultAIProviders: addDefaultAIProviders_default
};
async function migrate(plugin) {
const migrationsToRun = Object.keys(migrations).filter(
@ -19193,8 +19524,8 @@ QuickAdd will now revert to backup.`
var migrate_default = migrate;
// src/gui/UpdateModal/UpdateModal.ts
var import_obsidian38 = require("obsidian");
var import_obsidian39 = require("obsidian");
var import_obsidian40 = require("obsidian");
async function getReleaseNotesAfter(repoOwner, repoName, releaseTagName) {
const response = await fetch(
`https://api.github.com/repos/${repoOwner}/${repoName}/releases`
@ -19222,7 +19553,7 @@ function addExtraHashToHeadings(markdownText, numHashes = 1) {
}
return lines.join("\n");
}
var UpdateModal = class extends import_obsidian39.Modal {
var UpdateModal = class extends import_obsidian40.Modal {
constructor(previousQAVersion) {
super(app);
this.previousVersion = previousQAVersion;
@ -19277,18 +19608,18 @@ ${andNow}
${addExtraHashToHeadings(
releaseNotes
)}`;
void import_obsidian39.MarkdownRenderer.renderMarkdown(
void import_obsidian40.MarkdownRenderer.renderMarkdown(
markdownStr,
contentDiv,
app.vault.getRoot().path,
new import_obsidian38.Component()
new import_obsidian39.Component()
);
}
};
// src/gui/MacroGUIs/AIAssistantInfiniteCommandSettingsModal.ts
var import_obsidian40 = require("obsidian");
var InfiniteAIAssistantCommandSettingsModal = class extends import_obsidian40.Modal {
var import_obsidian41 = require("obsidian");
var InfiniteAIAssistantCommandSettingsModal = class extends import_obsidian41.Modal {
constructor(settings) {
super(app);
this.showAdvancedSettings = false;
@ -19303,7 +19634,10 @@ var InfiniteAIAssistantCommandSettingsModal = class extends import_obsidian40.Mo
this.display();
}
get systemPromptTokenLength() {
return getTokenCount(this.settings.systemPrompt, this.settings.model);
const model = getModelByName(this.settings.model);
if (!model)
return Number.POSITIVE_INFINITY;
return getTokenCount(this.settings.systemPrompt, model);
}
display() {
this.contentEl.empty();
@ -19350,10 +19684,12 @@ var InfiniteAIAssistantCommandSettingsModal = class extends import_obsidian40.Mo
this.display();
}
addModelSetting(container) {
new import_obsidian40.Setting(container).setName("Model").setDesc("The model the AI Assistant will use").addDropdown((dropdown) => {
for (const model of models_and_ask_me) {
new import_obsidian41.Setting(container).setName("Model").setDesc("The model the AI Assistant will use").addDropdown((dropdown) => {
const models = getModelNames();
for (const model of models) {
dropdown.addOption(model, model);
}
dropdown.addOption("Ask me", "Ask me");
dropdown.setValue(this.settings.model);
dropdown.onChange((value) => {
this.settings.model = value;
@ -19362,7 +19698,7 @@ var InfiniteAIAssistantCommandSettingsModal = class extends import_obsidian40.Mo
});
}
addOutputVariableNameSetting(container) {
new import_obsidian40.Setting(container).setName("Output variable name").setDesc(
new import_obsidian41.Setting(container).setName("Output variable name").setDesc(
"The name of the variable used to store the AI Assistant output, i.e. {{value:output}}."
).addText((text2) => {
text2.setValue(this.settings.outputVariableName).onChange(
@ -19373,12 +19709,12 @@ var InfiniteAIAssistantCommandSettingsModal = class extends import_obsidian40.Mo
});
}
addSystemPromptSetting(contentEl) {
new import_obsidian40.Setting(contentEl).setName("System Prompt").setDesc("The system prompt for the AI Assistant");
new import_obsidian41.Setting(contentEl).setName("System Prompt").setDesc("The system prompt for the AI Assistant");
const container = this.contentEl.createEl("div");
const tokenCount = container.createEl("span");
tokenCount.style.color = "var(--text-muted-color)";
container.appendChild(tokenCount);
const textAreaComponent = new import_obsidian40.TextAreaComponent(contentEl);
const textAreaComponent = new import_obsidian41.TextAreaComponent(contentEl);
textAreaComponent.setValue(this.settings.systemPrompt).onChange(async (value) => {
this.settings.systemPrompt = value;
formatDisplay.innerText = await displayFormatter.format(value);
@ -19398,7 +19734,7 @@ var InfiniteAIAssistantCommandSettingsModal = class extends import_obsidian40.Mo
textAreaComponent.inputEl.style.minHeight = "100px";
textAreaComponent.inputEl.style.marginBottom = "1em";
const formatDisplay = this.contentEl.createEl("span");
const updateTokenCount = (0, import_obsidian40.debounce)(() => {
const updateTokenCount = (0, import_obsidian41.debounce)(() => {
tokenCount.innerText = `Token count: ${this.systemPromptTokenLength}`;
}, 50);
updateTokenCount();
@ -19407,7 +19743,7 @@ var InfiniteAIAssistantCommandSettingsModal = class extends import_obsidian40.Mo
))();
}
addShowAdvancedSettingsToggle(container) {
new import_obsidian40.Setting(container).setName("Show advanced settings").setDesc(
new import_obsidian41.Setting(container).setName("Show advanced settings").setDesc(
"Show advanced settings such as temperature, top p, and frequency penalty."
).addToggle((toggle) => {
toggle.setValue(this.showAdvancedSettings);
@ -19418,7 +19754,7 @@ var InfiniteAIAssistantCommandSettingsModal = class extends import_obsidian40.Mo
});
}
addTemperatureSetting(container) {
new import_obsidian40.Setting(container).setName("Temperature").setDesc(
new import_obsidian41.Setting(container).setName("Temperature").setDesc(
"Sampling temperature. Higher values like 0.8 makes the output more random, whereas lower values like 0.2 will make it more focused and deterministic. The default is 1."
).addSlider((slider) => {
slider.setLimits(0, 1, 0.1);
@ -19432,7 +19768,7 @@ var InfiniteAIAssistantCommandSettingsModal = class extends import_obsidian40.Mo
});
}
addTopPSetting(container) {
new import_obsidian40.Setting(container).setName("Top P").setDesc(
new import_obsidian41.Setting(container).setName("Top P").setDesc(
"Nucleus sampling - consider this an alternative to temperature. The model considers the results of the tokens with top_p probability mass. 0.1 means only tokens compromising the top 10% probability mass are considered. The default is 1."
).addSlider((slider) => {
slider.setLimits(0, 1, 0.1);
@ -19446,7 +19782,7 @@ var InfiniteAIAssistantCommandSettingsModal = class extends import_obsidian40.Mo
});
}
addFrequencyPenaltySetting(container) {
new import_obsidian40.Setting(container).setName("Frequency Penalty").setDesc(
new import_obsidian41.Setting(container).setName("Frequency Penalty").setDesc(
"Positive values penalize new tokens based on their existing frequency in the text so far, decreasing the model's likelihood to repeat the same line verbatim. The default is 0."
).addSlider((slider) => {
slider.setLimits(0, 2, 0.1);
@ -19460,7 +19796,7 @@ var InfiniteAIAssistantCommandSettingsModal = class extends import_obsidian40.Mo
});
}
addPresencePenaltySetting(container) {
new import_obsidian40.Setting(container).setName("Presence Penalty").setDesc(
new import_obsidian41.Setting(container).setName("Presence Penalty").setDesc(
"Positive values penalize new tokens based on whether they appear in the text so far, increasing the model's likelihood to talk about new topics. The default is 0."
).addSlider((slider) => {
slider.setLimits(0, 2, 0.1);
@ -19474,7 +19810,7 @@ var InfiniteAIAssistantCommandSettingsModal = class extends import_obsidian40.Mo
});
}
addResultJoinerSetting(container) {
new import_obsidian40.Setting(container).setName("Result Joiner").setDesc(
new import_obsidian41.Setting(container).setName("Result Joiner").setDesc(
"The string used to join multiple LLM responses together. The default is a newline."
).addText((text2) => {
text2.setValue(this.settings.resultJoiner).onChange((value) => {
@ -19483,7 +19819,7 @@ var InfiniteAIAssistantCommandSettingsModal = class extends import_obsidian40.Mo
});
}
addChunkSeparatorSetting(container) {
new import_obsidian40.Setting(container).setName("Chunk Separator").setDesc(
new import_obsidian41.Setting(container).setName("Chunk Separator").setDesc(
"The string used to separate chunks of text. The default is a newline."
).addText((text2) => {
text2.setValue(this.settings.chunkSeparator).onChange(
@ -19494,11 +19830,16 @@ var InfiniteAIAssistantCommandSettingsModal = class extends import_obsidian40.Mo
});
}
addMaxTokensSetting(container) {
new import_obsidian40.Setting(container).setName("Max Chunk Tokens").setDesc(
new import_obsidian41.Setting(container).setName("Max Chunk Tokens").setDesc(
"The maximum number of tokens in each chunk, calculated as the chunk token size + prompt template token size + system prompt token size. Make sure you leave room for the model to respond to the prompt."
).addSlider((slider) => {
const modelMaxTokens = getModelMaxTokens(this.settings.model);
slider.setLimits(1, modelMaxTokens - this.systemPromptTokenLength, 1);
const model = getModelByName(this.settings.model);
if (!model) {
throw new Error(
`Model ${this.settings.model} not found in settings`
);
}
slider.setLimits(1, model.maxTokens - this.systemPromptTokenLength, 1);
slider.setDynamicTooltip();
slider.setValue(this.settings.maxChunkTokens);
slider.onChange((value) => {
@ -19507,7 +19848,7 @@ var InfiniteAIAssistantCommandSettingsModal = class extends import_obsidian40.Mo
});
}
addMergeChunksSetting(container) {
new import_obsidian40.Setting(container).setName("Merge Chunks").setDesc(
new import_obsidian41.Setting(container).setName("Merge Chunks").setDesc(
"Merge chunks together by putting them in the same prompt, until the max tokens limit is reached. Useful for sending fewer queries overall, but may result in less coherent responses."
).addToggle((toggle) => {
toggle.setValue(this.settings.mergeChunks);
@ -19523,7 +19864,7 @@ var InfiniteAIAssistantCommandSettingsModal = class extends import_obsidian40.Mo
};
// src/main.ts
var QuickAdd = class extends import_obsidian41.Plugin {
var QuickAdd = class extends import_obsidian42.Plugin {
get api() {
return QuickAddApi.GetApi(app, this, new ChoiceExecutor(app, this));
}

@ -1,7 +1,7 @@
{
"id": "quickadd",
"name": "QuickAdd",
"version": "1.7.0",
"version": "1.8.1",
"minAppVersion": "0.13.19",
"description": "Quickly add new pages or content to your vault.",
"author": "Christian B. B. Houmann",

@ -1743,6 +1743,12 @@ function arraymove(arr, fromIndex, toIndex) {
function get_active_file(app2) {
return app2.workspace.activeEditor?.file ?? app2.workspace.getActiveFile();
}
function get_folder_path_from_file_path(path) {
const path_separator = path.lastIndexOf("/");
if (path_separator !== -1)
return path.slice(0, path_separator);
return "";
}
// src/settings/suggesters/FileSuggester.ts
var FileSuggestMode;
@ -2663,7 +2669,10 @@ var InternalModuleHooks = class extends InternalModule {
}
generate_on_all_templates_executed() {
return (callback_function) => {
const event_ref = app.workspace.on("templater:all-templates-executed", () => callback_function());
const event_ref = app.workspace.on("templater:all-templates-executed", async () => {
await delay(1);
callback_function();
});
if (event_ref) {
this.event_refs.push(event_ref);
}
@ -3582,7 +3591,11 @@ var Templater = class {
}
const extension = template instanceof import_obsidian12.TFile ? template.extension || "md" : "md";
const created_note = await errorWrapper(async () => {
const path = app.vault.getAvailablePath((0, import_obsidian12.normalizePath)(`${folder?.path ?? ""}/${filename ?? "Untitled"}`), extension);
const path = app.vault.getAvailablePath((0, import_obsidian12.normalizePath)(`${folder?.path ?? ""}/${filename || "Untitled"}`), extension);
const folder_path = get_folder_path_from_file_path(path);
if (folder_path && !app.vault.getAbstractFileByPathInsensitive(folder_path)) {
await app.vault.createFolder(folder_path);
}
return app.vault.create(path, "");
}, `Couldn't create ${extension} file.`);
if (created_note == null) {

@ -1,7 +1,7 @@
{
"id": "templater-obsidian",
"name": "Templater",
"version": "2.2.1",
"version": "2.2.3",
"description": "Create and use templates",
"minAppVersion": "1.5.0",
"author": "SilentVoid",

@ -69,8 +69,8 @@
"state": {
"type": "markdown",
"state": {
"file": "00.01 Admin/Calendars/2024-03-03.md",
"mode": "preview",
"file": "00.01 Admin/Calendars/2024-03-10.md",
"mode": "source",
"source": true
}
}
@ -158,7 +158,7 @@
"state": {
"type": "backlink",
"state": {
"file": "00.01 Admin/Calendars/2024-03-03.md",
"file": "00.01 Admin/Calendars/2024-03-10.md",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
@ -175,7 +175,7 @@
"state": {
"type": "outgoing-link",
"state": {
"file": "00.01 Admin/Calendars/2024-03-03.md",
"file": "00.01 Admin/Calendars/2024-03-10.md",
"linksCollapsed": false,
"unlinkedCollapsed": false
}
@ -229,7 +229,6 @@
"msg-handler:MSG Handler": false,
"ledger-obsidian:Add to Ledger": false,
"obsidian-rich-links:Rich Links": false,
"obsidian-map-view:Open map view": false,
"obsidian-gallery:Gallery": false,
"obsidian-metatable:Metatable": false,
"obsidian-full-calendar:Open Full Calendar": false,
@ -239,40 +238,41 @@
"obsidian-camera:Obsidian Camera": false,
"table-editor-obsidian:Advanced Tables Toolbar": false,
"obsidian42-brat:BRAT": false,
"templater-obsidian:Templater": false,
"obsidian-tts:Text to Speech": false,
"obsidian-book-search-plugin:Create new book note": false,
"obsidian-memos:Memos": false
"templater-obsidian:Templater": false,
"obsidian-memos:Memos": false,
"obsidian-map-view:Open map view": false
}
},
"active": "7f7ef82aa074f90a",
"lastOpenFiles": [
"00.01 Admin/Calendars/2024-03-02.md",
"00.01 Admin/Calendars/2024-03-03.md",
"00.01 Admin/Calendars/2024-03-09.md",
"00.01 Admin/Calendars/2024-03-10.md",
"00.03 News/The Pentagons Silicon Valley Problem, by Andrew Cockburn.md",
"01.02 Home/@Main Dashboard.md",
"00.03 News/The (Many) Vintages of the Century.md",
"00.02 Inbox/La Louisiane.md",
"00.01 Admin/Calendars/2024-03-01.md",
"00.01 Admin/Calendars/Events/2024-03-01 ⚽️ AS Monaco - PSG (0-0).md",
"03.01 Reading list/Yoga.md",
"00.01 Admin/Calendars/2024-03-08.md",
"00.08 Bookmarks/Bookmarks - Mac applications.md",
"01.02 Home/@Shopping list.md",
"00.01 Admin/Calendars/2024-03-07.md",
"00.01 Admin/Calendars/2024-03-06.md",
"03.03 Food & Wine/Chilli con Carne.md",
"03.01 Reading list/Invisible Man.md",
"00.01 Admin/Calendars/2024-03-05.md",
"00.01 Admin/Calendars/Events/2024-03-05 ⚽️ Real Sociedad - PSG (1-2).md",
"02.02 Paris/Paris SG.md",
"00.01 Admin/Calendars/Events/2024-02-14 ⚽️ PSG - Real Sociedad (2-0).md",
"01.06 Health/2023-12-15 Eczema.md",
"01.02 Home/@Main Dashboard.md",
"00.08 Bookmarks/Bookmarks - Utilities.md",
"00.01 Admin/Calendars/2024-02-29.md",
"00.02 Inbox/Bad Kids.md",
"00.02 Inbox/Project Hail Mary.md",
"03.01 Reading list/@Reading master.md",
"00.02 Inbox/Fifth Sun.md",
"00.02 Inbox/Lolita.md",
"03.01 Reading list/Soumission.md",
"00.02 Inbox/Invisible Man.md",
"00.01 Admin/Calendars/2024-02-28.md",
"00.01 Admin/Calendars/2024-02-27.md",
"00.03 News/A Teens Fatal Plunge Into the London Underworld.md",
"03.03 Food & Wine/Big Shells With Spicy Lamb Sausage and Pistachios.md",
"00.01 Admin/Calendars/2024-02-26.md",
"00.03 News/The surreal life of a professional bridesmaid - The Hustle.md",
"03.01 Reading list/Zoo Station.md",
"02.03 Zürich/Dr Cleopatra Morales.md",
"00.01 Admin/Calendars/Events/2024-03-01 ⚽️ AS Monaco - PSG (0-0).md",
"03.03 Food & Wine/Korean Barbecue-Style Meatballs.md",
"05.02 Networks/Selfhosting.md",
"05.02 Networks/VPS Console Dialogue.md",
"00.01 Admin/Calendars/2024-03-04.md",
"00.01 Admin/Calendars/2024-03-03.md",
"00.02 Inbox/The Spy War How the C.I.A. Secretly Helps Ukraine Fight Putin.md",
"00.03 News/The Great Pretenders How two faux-Inuit sisters cashed in on a life of deception.md",
"00.03 News/I always believed my funny, kind father was killed by a murderous teenage gang. Three decades on, I discovered the truth.md",
"06.01 Finances/2024.ledger",
"00.01 Admin/dv-views/query_vinyl.js",
"03.05 Vinyls",

@ -16,9 +16,9 @@ Stress: 25
FrontHeadBar: 5
EarHeadBar: 30
BackHeadBar: 20
Water: 0.5
Coffee: 1
Steps:
Water: 2.95
Coffee: 2
Steps: 7769
Weight:
Ski:
IceSkating:
@ -116,6 +116,8 @@ This section does serve for quick memos.
🚗: [[@France|Nancy]] to [[@@Zürich|Zürich]]
📖: [[Invisible Man]]
&emsp;
---

@ -0,0 +1,134 @@
---
title: "🗒 Daily Note"
allDay: true
date: 2024-03-04
Date: 2024-03-04
DocType: Note
Hierarchy:
TimeStamp:
location:
CollapseMetaTable: true
Sleep: 7
Happiness: 85
Gratefulness: 90
Stress: 25
FrontHeadBar: 5
EarHeadBar: 30
BackHeadBar: 20
Water: 3.25
Coffee: 6
Steps: 11577
Weight:
Ski:
IceSkating:
Riding:
Racket:
Football:
Swim:
---
%% Parent:: [[@Life Admin]] %%
---
[[2024-03-03|<< 🗓 Previous ]] &emsp; &emsp; &emsp; [[@Main Dashboard|Back]] &emsp; &emsp; &emsp; [[2024-03-05|🗓 Next >>]]
---
&emsp;
```button
name Record today's health
type command
action MetaEdit: Run MetaEdit
id EditMetaData
```
^button-2024-03-04Edit
```button
name Save
type command
action Save current file
id Save
```
^button-2024-03-04NSave
&emsp;
# 2024-03-04
&emsp;
> [!summary]+
> Daily note for 2024-03-04
&emsp;
```toc
style: number
```
&emsp;
---
&emsp;
### ✅ Tasks of the day
&emsp;
```tasks
not done
due on 2024-03-04
path does not include Templates
hide backlinks
hide task count
```
&emsp;
---
&emsp;
### 📝 Memos
&emsp;
This section does serve for quick memos.
&emsp;
%% --- %%
&emsp;
---
&emsp;
### 🗒 Notes
&emsp;
📖: [[Invisible Man]]
&emsp;
---
&emsp;
### :link: Linked activity
&emsp;
```dataview
Table from [[2024-03-04]]
```
&emsp;
&emsp;

@ -0,0 +1,139 @@
---
title: "🗒 Daily Note"
allDay: true
date: 2024-03-05
Date: 2024-03-05
DocType: Note
Hierarchy:
TimeStamp:
location:
CollapseMetaTable: true
Sleep: 8
Happiness: 85
Gratefulness: 90
Stress: 25
FrontHeadBar: 5
EarHeadBar: 30
BackHeadBar: 20
Water: 2.2
Coffee: 5
Steps: 10472
Weight: 94.6
Ski:
IceSkating:
Riding:
Racket:
Football:
Swim:
---
%% Parent:: [[@Life Admin]] %%
---
[[2024-03-04|<< 🗓 Previous ]] &emsp; &emsp; &emsp; [[@Main Dashboard|Back]] &emsp; &emsp; &emsp; [[2024-03-06|🗓 Next >>]]
---
&emsp;
```button
name Record today's health
type command
action MetaEdit: Run MetaEdit
id EditMetaData
```
^button-2024-03-05Edit
```button
name Save
type command
action Save current file
id Save
```
^button-2024-03-05NSave
&emsp;
# 2024-03-05
&emsp;
> [!summary]+
> Daily note for 2024-03-05
&emsp;
```toc
style: number
```
&emsp;
---
&emsp;
### ✅ Tasks of the day
&emsp;
```tasks
not done
due on 2024-03-05
path does not include Templates
hide backlinks
hide task count
```
&emsp;
---
&emsp;
### 📝 Memos
&emsp;
This section does serve for quick memos.
&emsp;
- [x] 09:18 :stopwatch: [[@Life Admin|Admin]]: Check where we are with Jaeger watch 📅 2024-03-08 ✅ 2024-03-08
%% --- %%
&emsp;
---
&emsp;
### 🗒 Notes
&emsp;
📖: [[Invisible Man]]
🍴: [[Korean Barbecue-Style Meatballs]]
📺: [[2024-03-05 ⚽️ Real Sociedad - PSG (1-2)]]
&emsp;
---
&emsp;
### :link: Linked activity
&emsp;
```dataview
Table from [[2024-03-05]]
```
&emsp;
&emsp;

@ -0,0 +1,136 @@
---
title: "🗒 Daily Note"
allDay: true
date: 2024-03-06
Date: 2024-03-06
DocType: Note
Hierarchy:
TimeStamp:
location:
CollapseMetaTable: true
Sleep: 8
Happiness: 85
Gratefulness: 90
Stress: 25
FrontHeadBar: 5
EarHeadBar: 30
BackHeadBar: 20
Water: 2.8
Coffee: 4
Steps: 10709
Weight:
Ski:
IceSkating:
Riding:
Racket:
Football:
Swim:
---
%% Parent:: [[@Life Admin]] %%
---
[[2024-03-05|<< 🗓 Previous ]] &emsp; &emsp; &emsp; [[@Main Dashboard|Back]] &emsp; &emsp; &emsp; [[2024-03-07|🗓 Next >>]]
---
&emsp;
```button
name Record today's health
type command
action MetaEdit: Run MetaEdit
id EditMetaData
```
^button-2024-03-06Edit
```button
name Save
type command
action Save current file
id Save
```
^button-2024-03-06NSave
&emsp;
# 2024-03-06
&emsp;
> [!summary]+
> Daily note for 2024-03-06
&emsp;
```toc
style: number
```
&emsp;
---
&emsp;
### ✅ Tasks of the day
&emsp;
```tasks
not done
due on 2024-03-06
path does not include Templates
hide backlinks
hide task count
```
&emsp;
---
&emsp;
### 📝 Memos
&emsp;
This section does serve for quick memos.
&emsp;
%% --- %%
&emsp;
---
&emsp;
### 🗒 Notes
&emsp;
📖: [[Invisible Man]], [[Yoga]]
🍽️: [[Chilli con Carne]]
&emsp;
---
&emsp;
### :link: Linked activity
&emsp;
```dataview
Table from [[2024-03-06]]
```
&emsp;
&emsp;

@ -0,0 +1,136 @@
---
title: "🗒 Daily Note"
allDay: true
date: 2024-03-07
Date: 2024-03-07
DocType: Note
Hierarchy:
TimeStamp:
location:
CollapseMetaTable: true
Sleep: 7
Happiness: 85
Gratefulness: 90
Stress: 25
FrontHeadBar: 5
EarHeadBar: 30
BackHeadBar: 20
Water: 2.5
Coffee: 5
Steps: 10475
Weight:
Ski:
IceSkating:
Riding:
Racket:
Football:
Swim:
---
%% Parent:: [[@Life Admin]] %%
---
[[2024-03-06|<< 🗓 Previous ]] &emsp; &emsp; &emsp; [[@Main Dashboard|Back]] &emsp; &emsp; &emsp; [[2024-03-08|🗓 Next >>]]
---
&emsp;
```button
name Record today's health
type command
action MetaEdit: Run MetaEdit
id EditMetaData
```
^button-2024-03-07Edit
```button
name Save
type command
action Save current file
id Save
```
^button-2024-03-07NSave
&emsp;
# 2024-03-07
&emsp;
> [!summary]+
> Daily note for 2024-03-07
&emsp;
```toc
style: number
```
&emsp;
---
&emsp;
### ✅ Tasks of the day
&emsp;
```tasks
not done
due on 2024-03-07
path does not include Templates
hide backlinks
hide task count
```
&emsp;
---
&emsp;
### 📝 Memos
&emsp;
This section does serve for quick memos.
&emsp;
%% --- %%
&emsp;
---
&emsp;
### 🗒 Notes
&emsp;
📖: [[Yoga]]
🚗: [[@@Zürich|Zürich]] to [[@France|Dijon]]
&emsp;
---
&emsp;
### :link: Linked activity
&emsp;
```dataview
Table from [[2024-03-07]]
```
&emsp;
&emsp;

@ -0,0 +1,139 @@
---
title: "🗒 Daily Note"
allDay: true
date: 2024-03-08
Date: 2024-03-08
DocType: Note
Hierarchy:
TimeStamp:
location:
CollapseMetaTable: true
Sleep: 8
Happiness: 85
Gratefulness: 90
Stress: 25
FrontHeadBar: 5
EarHeadBar: 30
BackHeadBar: 20
Water: 3
Coffee: 2
Steps: 10319
Weight:
Ski:
IceSkating:
Riding:
Racket:
Football:
Swim:
---
%% Parent:: [[@Life Admin]] %%
---
[[2024-03-07|<< 🗓 Previous ]] &emsp; &emsp; &emsp; [[@Main Dashboard|Back]] &emsp; &emsp; &emsp; [[2024-03-09|🗓 Next >>]]
---
&emsp;
```button
name Record today's health
type command
action MetaEdit: Run MetaEdit
id EditMetaData
```
^button-2024-03-08Edit
```button
name Save
type command
action Save current file
id Save
```
^button-2024-03-08NSave
&emsp;
# 2024-03-08
&emsp;
> [!summary]+
> Daily note for 2024-03-08
&emsp;
```toc
style: number
```
&emsp;
---
&emsp;
### ✅ Tasks of the day
&emsp;
```tasks
not done
due on 2024-03-08
path does not include Templates
hide backlinks
hide task count
```
&emsp;
---
&emsp;
### 📝 Memos
&emsp;
This section does serve for quick memos.
&emsp;
- [ ] 19:26 :chair: [[Household]]: Reprendre la recherche de table a manger demi-lune 📅2024-10-15
- [ ] 19:26 :horse: [[Household]]: Reprendre la recherche de statue de cheval 📅2024-10-30
- [ ] 19:27 :diya_lamp: [[Household]]: Reprendre la recherche de lampe bouillotte 📅2024-10-20
- [ ] 19:28 :test_rl: [[Household]]: Reprendre la recherche de deco liée au polo 📅2024-10-25
- [ ] 20:47 :couch_and_lamp: [[Household]]: Reprendre la recherche de lampadaires 📅2024-11-05
%% --- %%
&emsp;
---
&emsp;
### 🗒 Notes
&emsp;
🚗: [[@France|Dijon]] to [[@@Zürich|Zürich]]
&emsp;
---
&emsp;
### :link: Linked activity
&emsp;
```dataview
Table from [[2024-03-08]]
```
&emsp;
&emsp;

@ -0,0 +1,136 @@
---
title: "🗒 Daily Note"
allDay: true
date: 2024-03-09
Date: 2024-03-09
DocType: Note
Hierarchy:
TimeStamp:
location:
CollapseMetaTable: true
Sleep: 7
Happiness: 85
Gratefulness: 90
Stress: 25
FrontHeadBar: 5
EarHeadBar: 20
BackHeadBar: 30
Water: 3.66
Coffee: 1
Steps: 6589
Weight:
Ski: 12
IceSkating:
Riding:
Racket:
Football:
Swim:
---
%% Parent:: [[@Life Admin]] %%
---
[[2024-03-08|<< 🗓 Previous ]] &emsp; &emsp; &emsp; [[@Main Dashboard|Back]] &emsp; &emsp; &emsp; [[2024-03-10|🗓 Next >>]]
---
&emsp;
```button
name Record today's health
type command
action MetaEdit: Run MetaEdit
id EditMetaData
```
^button-2024-03-09Edit
```button
name Save
type command
action Save current file
id Save
```
^button-2024-03-09NSave
&emsp;
# 2024-03-09
&emsp;
> [!summary]+
> Daily note for 2024-03-09
&emsp;
```toc
style: number
```
&emsp;
---
&emsp;
### ✅ Tasks of the day
&emsp;
```tasks
not done
due on 2024-03-09
path does not include Templates
hide backlinks
hide task count
```
&emsp;
---
&emsp;
### 📝 Memos
&emsp;
This section does serve for quick memos.
&emsp;
%% --- %%
&emsp;
---
&emsp;
### 🗒 Notes
&emsp;
🏔️: [[Flumserberg]]
📖: [[Yoga]]
&emsp;
---
&emsp;
### :link: Linked activity
&emsp;
```dataview
Table from [[2024-03-09]]
```
&emsp;
&emsp;

@ -0,0 +1,134 @@
---
title: "🗒 Daily Note"
allDay: true
date: 2024-03-10
Date: 2024-03-10
DocType: Note
Hierarchy:
TimeStamp:
location:
CollapseMetaTable: true
Sleep: 7.5
Happiness: 85
Gratefulness: 90
Stress: 25
FrontHeadBar: 5
EarHeadBar: 20
BackHeadBar: 30
Water:
Coffee:
Steps:
Weight:
Ski:
IceSkating:
Riding:
Racket:
Football:
Swim:
---
%% Parent:: [[@Life Admin]] %%
---
[[2024-03-09|<< 🗓 Previous ]] &emsp; &emsp; &emsp; [[@Main Dashboard|Back]] &emsp; &emsp; &emsp; [[2024-03-11|🗓 Next >>]]
---
&emsp;
```button
name Record today's health
type command
action MetaEdit: Run MetaEdit
id EditMetaData
```
^button-2024-03-10Edit
```button
name Save
type command
action Save current file
id Save
```
^button-2024-03-10NSave
&emsp;
# 2024-03-10
&emsp;
> [!summary]+
> Daily note for 2024-03-10
&emsp;
```toc
style: number
```
&emsp;
---
&emsp;
### ✅ Tasks of the day
&emsp;
```tasks
not done
due on 2024-03-10
path does not include Templates
hide backlinks
hide task count
```
&emsp;
---
&emsp;
### 📝 Memos
&emsp;
This section does serve for quick memos.
&emsp;
%% --- %%
&emsp;
---
&emsp;
### 🗒 Notes
&emsp;
Loret ipsum
&emsp;
---
&emsp;
### :link: Linked activity
&emsp;
```dataview
Table from [[2024-03-10]]
```
&emsp;
&emsp;

@ -0,0 +1,12 @@
---
title: "🧚🏼 Arrivée Meggi-mo"
allDay: true
date: 2022-03-19
endDate: 2022-03-20
CollapseMetaTable: true
---
# Arrivée de [[@@MRCK|Meggi-mo]]
- [l] Arrivée à [[@@Zürich|Zürich]] de Meggi-mo, le [[2022-03-19|19/03/2022]].

@ -0,0 +1,11 @@
---
title: "🧚🏼 Départ de Meggi-mo"
allDay: true
date: 2022-03-24
endDate: 2022-03-25
CollapseMetaTable: true
---
# Départ de Meggi-mo
Départ de ma [[@@MRCK|Meggi-mo]] le [[2022-03-24|24/03/2022]].

@ -0,0 +1,9 @@
---
title: "👨‍👩‍👧 Arrivée de Papa"
allDay: false
startTime: 20:25
endTime: 20:30
date: 2022-03-31
---
- [l] [[2022-03-31]], arrivée de [[Amaury de Villeneuve|Papa]] à [[@@Zürich|Zürich]]

@ -0,0 +1,9 @@
---
title: "👨‍👩‍👧 Départ Papa"
allDay: false
startTime: 13:30
endTime: 14:00
date: 2022-04-04
---
[[2022-04-04]], départ de [[Amaury de Villeneuve|Papa]]

@ -0,0 +1,11 @@
---
title: "🗳 1er tour Présidentielle"
allDay: true
date: 2022-04-10
endDate: 2022-04-11
CollapseMetaTable: true
---
1er tour des élections présidentielles à [[@@Paris|Paris]], le [[2022-04-10|10 avril 2022]]; avec [[@@MRCK|Meggi-mo]] dans l'isoloir.

@ -0,0 +1,8 @@
---
title: "🗳 2nd tour élections présidentielles"
allDay: true
date: 2022-04-24
endDate: 2022-04-25
---
2nd tour des élections présidentielles le [[2022-04-24|24 Avril]] à [[@@Paris|Paris]].

@ -0,0 +1,9 @@
---
title: "🛩 Arrivée à Lisbonne"
allDay: false
startTime: 16:00
endTime: 16:30
date: 2022-04-27
---
Arrival on [[2022-04-27|this day]] in [[Lisbon]].

@ -0,0 +1,9 @@
---
title: "🛩 Départ de Lisbonne"
allDay: false
startTime: 15:30
endTime: 16:00
date: 2022-05-01
---
Departure from [[Lisbon]] to [[@@Zürich|Zürich]] [[2022-05-01|this day]].

@ -0,0 +1,9 @@
---
title: "🧚🏼 Definite arrival of Meggi-mo to Züzü"
allDay: true
startTime: 06:30
endTime: 07:00
date: 2022-05-15
---
[[@@MRCK|Meggi-mo]] is arriving to [[@@Zürich|Zürich]] for good on [[2022-05-15|that day]].

@ -0,0 +1,17 @@
---
title: "🚆 Weekend in GVA"
allDay: true
date: 2022-10-14
endDate: 2022-10-17
CollapseMetaTable: true
---
Weekend à [[Geneva]] avec [[@@MRCK|Meggi-mo]].
&emsp;
Départ: [[2022-10-14]] de [[@@Zürich|Zürich]]
Retour: [[2022-10-16]] à [[@@Zürich|Zürich]]

@ -0,0 +1,16 @@
---
title: "🗼 Weekend à Paris"
allDay: true
date: 2022-10-21
endDate: 2022-10-24
CollapseMetaTable: true
---
Weekend à [[@@Paris|Paris]] avec [[@@MRCK|Meggi-mo]].
&emsp;
Départ: [[2022-10-21]] de [[@@Zürich|Zürich]]
Retour: [[2022-10-23]] à [[@@Zürich|Zürich]]

@ -0,0 +1,10 @@
---
title: "💍 Fiançailles Marguerite & Arnold"
allDay: false
startTime: 16:30
endTime: 15:00
date: 2022-11-19
CollapseMetaTable: true
---
Fiançailles de [[Marguerite de Villeneuve|Marguerite]] et [[Arnold Moulin|Arnold]] [[2022-11-19|ce jour]] à [[Geneva|Genève]].

@ -0,0 +1,12 @@
---
title: "👪 Papa à Zürich"
allDay: true
date: 2022-12-26
endDate: 2022-12-31
completed: null
CollapseMetaTable: true
---
[[Amaury de Villeneuve|Papa]] arrive à [[@@Zürich|Zürich]] le [[2022-12-26|26 décembre]] à 13h26.

@ -0,0 +1,12 @@
---
title: "Stef & Kyna in Zürich"
allDay: true
date: 2022-12-30
endDate: 2023-01-05
completed: null
CollapseMetaTable: true
---
Stef & Kyna arrivent à [[@@Zürich|Zürich]] le [[2022-12-30|30 décembre]] avec Swiss le matin.

@ -0,0 +1,13 @@
---
title: Médecin
allDay: false
startTime: 11:15
endTime: 12:15
date: 2023-01-23
completed: null
CollapseMetaTable: true
---
[[2023-01-23|Ce jour]], 1er RDV avec [[Dr Cleopatra Morales]].

@ -0,0 +1,12 @@
---
title: Genève
allDay: true
date: 2023-02-06
endDate: 2023-02-08
completed: null
CollapseMetaTable: true
---
Depart à [[Geneva|Genève]] [[2023-02-06|ce jour]] et retour le [[223-02-07|lendemain]].

@ -0,0 +1,13 @@
---
title: ⚕ Médecin
allDay: false
startTime: 12:15
endTime: 13:15
date: 2023-02-09
completed: null
CollapseMetaTable: true
---
[[2023-02-09|Ce jour]], RDV de suivi avec [[Dr Cleopatra Morales]]

@ -0,0 +1,91 @@
---
title: "👰‍♀ Mariage Eloi & Zélie"
allDay: true
date: 2023-02-10
endDate: 2023-02-12
CollapseMetaTable: true
---
Mariage d[[Eloi de Villeneuve|Éloi]] avec [[Zélie]] en [[@France|Bretagne]] (Rennes) [[2023-02-11|ce jour]].
&emsp;
🚆: 23h11, arrivée à Rennes
&emsp;
🏨: **Hotel Saint Antoine**<br>27 avenue Janvier<br>Rennes
&emsp;
### Vendredi 10 Février
&emsp;
#### 17h: Mariage civil
Mairie de Montfort-sur-Meu (35)
&emsp;
#### 20h30: Veillée de Prière
Chapelle du château de la Châsse
Iffendic (35)
&emsp;
---
&emsp;
### Samedi 11 Février
&emsp;
#### 14h: Messe de Mariage
Saint-Louis-Marie
Montfort-sur-Meu (35)
&emsp;
#### 16h30: Cocktail
Château de la Châsse
Iffendic (35)
&emsp;
#### 19h30: Dîner
Château de la Châsse
Iffendic (35)
&emsp;
---
&emsp;
### Dimanche 12 Février
&emsp;
#### 11h: Messe
Chapelle du château de la Châsse
Iffendic (35)
&emsp;
#### 12h: Déjeuner breton
Château de la Châsse
Iffendic (35)
&emsp;
🚆: 13h35, départ de Rennes

@ -0,0 +1,13 @@
---
title: 🎬 Tár @ Riff Raff
allDay: false
startTime: 20:30
endTime: 22:30
date: 2023-02-19
completed: null
CollapseMetaTable: true
---
[[2023-02-19|Ce jour]], [[Tár (2022)]] @ [[Riff Raff Kino Bar]].

@ -0,0 +1,12 @@
---
title: 🩺 Médecin
allDay: false
startTime: 15:00
endTime: 15:30
date: 2023-03-06
completed: null
CollapseMetaTable: true
---
[[2023-03-06|Ce jour]], rdv avec [[Dr Awad Abuawad]]

@ -0,0 +1,13 @@
---
title: 👨‍👩‍👧‍👦 Marg & Arnold à Zürich
allDay: true
date: 2023-03-11
endDate: 2023-03-13
completed: null
CollapseMetaTable: true
---
Arrivée le [[2023-03-11|11 mars]] de [[Marguerite de Villeneuve|Marg]] et [[Arnold Moulin|Arnold]].
Départ le [[2023-03-12|lendemain]].

@ -0,0 +1,12 @@
---
title: 👨‍👩‍👧‍👦 Molly & boyfriend in Zürich
allDay: true
date: 2023-03-18
endDate: 2023-03-20
completed: null
CollapseMetaTable: true
---
Weekend in [[@@Zürich|Zürich]] for [[@@MRCK|Meggi-mo]]s cousin Molly and boyfriend.
Arrival on [[2023-03-18|18th March]] and departure on Monday [[2023-03-20|20th March]].

@ -0,0 +1,13 @@
---
title: 🩺 Médecin
allDay: false
startTime: 11:45
endTime: 12:15
date: 2023-04-14
completed: null
CollapseMetaTable: true
---
[[2023-04-14|Ce jour]], rdv avec [[Dr Cleopatra Morales]]

@ -0,0 +1,10 @@
---
title: 🏠 Arrivée Papa
allDay: false
startTime: 20:26
endTime: 21:26
date: 2023-12-21
completed: null
---
[[2023-12-21|Ce jour]], arrivée de [[Amaury de Villeneuve|Papa]] à [[@@Zürich|Zürich]]

@ -0,0 +1,10 @@
---
title: 🗼 Départ Papa
allDay: false
startTime: 13:30
endTime: 14:30
date: 2023-12-27
completed: null
---
[[2023-12-27|Ce jour]], départ de [[Amaury de Villeneuve|Papa]] de [[@@Zürich|Zürich]] pour [[@@Paris|Paris]]

@ -0,0 +1,18 @@
---
title: ⚽️ Real Sociedad - PSG (1-2)
allDay: false
startTime: 21:00
endTime: 23:00
date: 2024-03-05
completed: null
---
[[2024-03-05|Ce jour]], Real Sociedad - [[Paris SG]]: 1-2
Buteurs:: ⚽️ Merino (RS)<br>⚽️⚽️ MBappé
&emsp;
```lineup
formation: 433
players: Donnaruma,Nuno Mendes (Mukiele),Beraldo,Hernandez,Hakimi (Soler),Ruiz (Ugarte),Vitinha,Zaïre-Emery,Barcola (Lee),M'Bappé,Dembélé (Kolo Muani)
```

@ -1,11 +0,0 @@
---
title: ⚽️ Real Sociedad - PSG
allDay: false
startTime: 21:00
endTime: 23:00
date: 2024-03-05
completed: null
---
[[2024-03-05|Ce jour]], Real Sociedad - [[Paris SG]]:
Buteurs::

@ -19,7 +19,7 @@ CollapseMetaTable: true
---
Parent:: [[@Reading master|Reading list]]
ReadingState:: 🟥
ReadingState:: 🟧
---

@ -0,0 +1,159 @@
---
Alias: [""]
Tag: ["🤵🏻", "🪖", "🇭🇺", "🇷🇺", "🕵🏼"]
Date: 2024-03-04
DocType: "WebClipping"
Hierarchy:
TimeStamp: 2024-03-04
Link: https://vsquare.org/russia-spies-flipped-expelled-spycatcher-ferenc-katrein-hungary/
location:
CollapseMetaTable: true
---
Parent:: [[@News|News]]
Read:: 🟥
---
&emsp;
```button
name Save
type command
action Save current file
id Save
```
^button-HowRussianSpiesGetFlippedorExpelledNSave
&emsp;
# How Russian Spies Get Flipped or Expelled, As Told by a Spycatcher
Szabolcs Panyi (VSquare)
Photos: Szabolcs Panyi (VSquare) 2024-02-01
**Caught a Russian spy? You may try to flip them first, perhaps offering work as a double agent—all with the help of the British, the French, or the Americans. If it doesnt work out, you can still expel them and send them home to Moscow. In an in depth-interview, former Hungarian counterintelligence officer Ferenc Katrein—once a director of operations at Constitution Protection Office (AH)—goes into detail about how allied security agencies work together to identify and disrupt Russian intelligence activity under diplomatic cover.** 
**SZABOLCS PANYI: Why is it so rare for Russian diplomats to get expelled for spying?**
FERENC KATREIN: A counterintelligence agency always has to decide if they want to develop a “spy case” that could result in an expulsion—or if they want to flip the spy. For example, if counterintelligence officers managed to reveal the agent network of a Russian spy and already flipped two or three of those agents, an expulsion makes less sense. They could either use the flipped agents to feed false information to the Russian intelligence officer—or make an attempt to approach and recruit that Russian. It goes something like this: “Listen, brother, everything you reported to Moscow for the last two years has been misinformation we fed to your agents. Youll either get into some serious trouble because of that—or you can work for us.” There is also a scenario where you make this move and try to recruit the Russian, and if it doesnt work out, you can still expel them.
**How do you convince them to flip?**
When you already have a few flipped or recruited agents and tons of personal information on that Russian spy, first, you will likely sit down with a partner agency, especially if youre from a small countrys counterintelligence service. This is because, if you want to recruit a Russian spy as a double agent, you have to offer them certain guarantees and opportunities. Besides a big bag of cash, you can typically offer medical treatments for sick family members, helping out with the kids schooling, and such stuff. But most of all, you have to guarantee their safety. And there are only really a few countries that can offer this: the British, the French, but most likely the Americans. So you may want to involve them, too.
**Lets go back to the basics. How do you check Russian diplomats seeking accreditation?**
It is an automatic process. When a foreign ministry receives an accreditation request for a diplomat, they notify relevant counterintelligence agencies, who then run it through their networks. These agencies both check their own database to see if there is a known history of the diplomat, and send the diplomats name and personal data to all member states who are in the alliance and ask for information.
**Everyone in the NATO alliance?**
Everyone. Usually, it is either the case that the new diplomat has a history in our own database or that one of the partner intelligence services will notify us and will send a specific message that the person has been checked or even processed. If there is an indication that a diplomat is connected to an intelligence service, it is also important to know in which area or “line” the diplomat is working. This is broken down by category, and usually the category or line also determines whether the person is suspected of being FSB, SVR or GRU. The categories have names or codes. Line N, for example, is illegal intelligence, [line X is espionage in technology](https://en.wikipedia.org/wiki/Line_X), etc.
If the partner services response indicates which line they suspect, it therefore follows that the diplomats affiliation is also indicated. For example, the X or technical line very likely means that the diplomat works for the SVR. If, say, the accredited diplomat is assigned to the military attachés office, he or she is likely to be GRU. So the position also predicts which service it belongs to. Say, if a new security officer comes into the Russian embassy with new accreditation, that person is likely to be FSB.
**Does a particular area predetermine whether the diplomat who comes there is, say, an SVR or a GRU officer?**
Absolutely. Media, culture, and political department is basically SVR. Scientific-technology positions too. Defending and advancing Russian economic interests is also a typical SVR field. The consular department can be FSB, but there is always room for someone from the SVR. Military affairs, war grave management issues are GRU. Interior, law enforcement attaché, border security, migration issues are all FSB. But often it also depends on the individuals personal history.
**What about an exact position, what does it tell you? Is it true that certain positions, like, for example, deputy head of the commercial representation, always go to intelligence officers?**
Yes, its common practice. If an intelligence officer finishes his or her posting after four years and leaves for Moscow, there is a good chance that the same position will also be filled by an incoming new intelligence officer. The reason is that—if we try to think like the Russians—it is easier for them to prepare their intelligence officers under diplomatic cover by teaching them in advance what they will be doing, and what the cover job will be. Its important that the cover story is always there and credible, and that he or she can do the cover job without fail so that the cover is not blown.
**And what are the categories in the identification process of an intelligence officer?**
Mostly there is the category of “suspected intelligence officer” and “identified intelligence officer”. There is little point in maintaining any other category.
**What is the percentage of suspected and identified intelligence officers among all Russian diplomats?**
Previously, well before the war, [I said that thirty-forty percent was usual](https://index.hu/english/2017/03/21/hungarian_secret_agent_reveals_how_serious_the_russian_threat_is/). But this is a difficult question. When you can clearly state that someone has been identified, then you have documents, evidence. Of course, you usually have less such cases. You have identification when, for example, you had an operation which resulted in some evidence. For example, you obtain a payroll that has the list of employees of a hostile intelligence service. 
**Last year,** [**we reported that Russian deputy ambassador and chargé daffaires Kirill Logvinov**](https://vsquare.org/russia-diplomats-spying-brussels-intelligence/) **was identified by Belgiums counterintelligence as an undercover intelligence officer. Is it common for a Russian embassys second in command to also be a high-ranking spy?**
Absolutely, but, in fact, it doesnt matter how high up someone is according to their diplomatic cover. It can be a deputy ambassador, but can also be the lowest ranking diplomat. Its just a cover anyway.
**The European Commission refused to expel Logvinov and other suspected Russian spies from Brussels. How does that make sense?**
There can be political reasons, of course—trying not to completely alienate Russia. There could also be a fear of retaliation. Then there is the possibility that these Russian intelligence officers are in fact acting as communication channels or backdoors to the Russian government. There might be regular discussions going on in the background, so that could be a legitimate reason. But if this is not the case, then not expelling them is only acceptable if Logvinov or similar Russian undercover intelligence officers are under complete surveillance, and the situation is controlled. 
For example, it could be the case, as we discussed, that multiple agents in the Russians network are already flipped by the local counterintelligence. However, Im not entirely sure that the EUs own security apparatus has the ability and the competence to recruit a Russian asset. Of course, its also not impossible that foreign partners—for example, the British or the French—are helping them out and that they are the ones carrying out such tasks.
![](https://vsquare.org/wp-content/uploads/2024/01/image1-1-1024x768.jpg)
Ferenc Katrein. Photo: Szabolcs Panyi
**What is the channel for sharing information on the background of Russian diplomats?**
Theres a dedicated network, a central system thats not connected to anything else, dedicated only for intelligence cooperation. Its not just for checking diplomats, its for any kind of information exchange between partner agencies of the alliance. 
**Is it possible that, if a Russian diplomat turns out to be an identified SVR agent, the host country will still accept the diplomatic accreditation?**
This is a political decision. You can tell the Russian foreign ministry to send someone else, but you can also accept their diplomat.
**But does it also mean that you accept it because at least you can keep an eye on that person and you can follow what they are doing?**
There can be such an operational consideration too, of course. It is only worth accepting if you have the capacity to do it. If you dont have the capacity, the opportunity, then dont take it. This does not only apply to diplomats, but also to the technical and administrative staff working there, and also to family members. With that, the number of those who need to be checked multiplies. Because it is also common practice to bring a wife or husband who may also be an intelligence officer.
**Do family members enjoy the same full diplomatic immunity?**
Some level, but not full. Their use for intelligence purposes is therefore riskier because they may have a different type of immunity. They are generally used for minor tasks, delivery, financial transactions etc. where the risk is also lower. Obviously they will not be used for the most sensitive tasks because of the lack of full protection.
**How common is it for Russian intelligence officers to be sent with a spouse?**
Usually they send them in pairs. Its safer for everyone, its better to send them if they come with the right family background. But it also depends on what the mission is. Singles may be sent on a different mission, or they may not even be used for operations in the country to which they are accredited. The best spies are used in a third country. That is why cooperation between counterintelligence services of allied countries is necessary.
**How typical is it that the Russian diplomats themselves are not the most important spies, that they are more like bait to keep the host countrys counterintelligence occupied?**
This is being deliberately done by the Russians sometimes. This is when it is important to mention that there are unofficial, non-diplomatic covers as well. Diplomatic cover gives you protection through diplomatic immunity, meaning whoever gets caught red-handed can be evacuated. If there is no immunity, prosecutors and the counterintelligence have much greater possibilities. However, when you dont have diplomatic cover, and you have a better chance of staying out of the spotlight, you may not attract the attention of the counterintelligence, so you have greater opportunities for espionage. With bigger risks come bigger gains.
**What is the procedure for expelling diplomats?**
The counterintelligence service gathers the information, clearly identifies the hostile intelligence agent, and when the Russian activity goes beyond a threshold or the spy starts to build ties with political or economic actors who are really sensitive or high-up, there is pressure on the counterintelligence to act. In such cases, the counterintelligence files a proposal to the political leadership to let them first identify and catch in the act the intelligence officer, and then ask the political leadership to expel him.
But first, the politicians must also approve identifying, “catching” the spy. It is a decision on the level of a cabinet member, minister, sometimes even the prime minister, since the government has to communicate the consequences at the political and diplomatic level. It can have serious political and economic consequences. It is not an issue anymore, but this was the case previously, for example, with the fear of the gas supplies being turned off by Russia.
**What is the typical Russian reaction?**
There is a “mirror response,” for sure, and that has to be calculated in. To retaliate, Russia will also ban someone, typically the same type and same number of diplomats.
**What are the types of expulsion?**
There is the “quiet expulsion,” where the director-general of the counterintelligence summons the diplomat, the Russian embassys liaison officer, or the Russian ambassador, and suggests that the diplomat should go home. Maybe the director-general also shows the ambassador a photograph or two, just to explain the reason for the expulsion. This always works.
Theres also a solution where, say, at a diplomatic reception or party, the minister of foreign affairs starts a chat with the Russian ambassador and says a few words. Its more subtle, more elegant, and less provocative. It could also be a way of avoiding a “mirror response.”
A more subtle degree of quiet expulsion is when the foreign minister summons the Russian ambassador and says a few words. But thats still the silent category, informally asking to be sent home.  
**Isnt there always a mirror response to a quiet expulsion?**
Its a gentleman-to-gentleman conversation, “well sort it out ourselves.” The Russians can also delegate someone else to replace the expelled diplomat. In such cases, theres not always a mirror response.
**What happens during an official expulsion?**
In those cases, the ambassador is summoned and the foreign ministry hands over a written note that a diplomat has been declared persona non grata, which has a legal consequence as well. This note is usually handed over by the foreign minister. In principle, the expulsion is only valid from the host country, but in more serious cases, a recommendation can be made that the expulsion applies to the Schengen area. This version also binds the allies to some extent.
![](https://vsquare.org/wp-content/uploads/2024/01/image4-1-1024x768.jpg)
Ferenc Katrein. Photo: Szabolcs Panyi
**What is the deadline for leaving the country?**
It depends on how serious the case is. Sometimes it is immediate, so basically within one or two days. But when it is a quiet expulsion, usually the host country takes family circumstances, like that the children have to be taken out of school, into consideration. So, for example, maybe in that case the Russian ambassador is told that the diplomat should leave by the end of the month. But for formal expulsions, there are set rules on how it should work. 
**In the 48 or 72 hours between expulsion and departure, is the diplomat still under surveillance by counterintelligence?**
Of course, until their very last movement! At that time, counterintelligence keeps an even closer watch to find out what follow-ups the diplomat has to do. Thats another bonus piece of information for counterintelligence. Who the diplomat is going to say goodbye to, where they are going to pick something up, drop something off. Thats why, no matter how much time the expelled Russian diplomat is given to leave the country, the diplomats own bosses will likely get them on a plane to Moscow as soon as possible.
[![](https://vsquare.org/wp-content/uploads/2023/11/cropped-male_Szabolcs-Edited-150x150.jpg)](https://vsquare.org/author/spanyi/)
[**Szabolcs Panyi**](https://vsquare.org/author/spanyi/)
VSquares Budapest-based lead investigative editor in charge of Central European investigations, Szabolcs Panyi is also a Hungarian investigative journalist at Direkt36. He covers national security, foreign policy, and Russian and Chinese influence. He was a European Press Prize finalist in 2018 and 2021.
&emsp;
&emsp;
---
`$= dv.el('center', 'Source: ' + dv.current().Link + ', ' + dv.current().Date.toLocaleString("fr-FR"))`

@ -0,0 +1,198 @@
---
Alias: [""]
Tag: ["🚔", "🇬🇧", "🔫"]
Date: 2024-03-04
DocType: "WebClipping"
Hierarchy:
TimeStamp: 2024-03-04
Link: https://www.theguardian.com/lifeandstyle/2024/feb/24/funny-kind-father-murderous-teenage-gang-three-decades-on-i-discovered-the-truth
location:
CollapseMetaTable: true
---
Parent:: [[@News|News]]
Read:: 🟥
---
&emsp;
```button
name Save
type command
action Save current file
id Save
```
^button-IalwaysbelievedmyfunnykindfatherwaskilledbyamurderousteenagegangNSave
&emsp;
# I always believed my funny, kind father was killed by a murderous teenage gang. Three decades on, I discovered the truth
It was a jubilant spring day in 1988. My sister Emily was home for the holidays, having completed her first term at her new educational institution where she had been sent against her will by social services after years of severe school phobia. Somehow, miraculously, she was happy. There were still a few clouds in the sky some of the other kids were disruptive, and she missed her old life and family but it was going to be OK.
I was 12, only a year from being a teenager, and the holidays stretched out before us. Such an atmosphere called for celebration. For us, a real treat meant a takeaway we usually couldnt afford them. My dad, Mike, was going to drive to the town centre: there was a chip shop Emily was keen on and it was her special day.
My mom, Jackie (in Birmingham we say “mom” no one knows why), gave him some money from her purse. I asked to go with him, some father-daughter time, but for some reason he didnt want me to. I pleaded, pouted; he refused, so I got angry and upset at perceived injustice, the beginning of a tantrum I was probably too old for. As he walked down the hall, I followed him and shouted, “I hate you!” I kicked the front door, but the reinforced dimpled glass could take it. His figure was distorted, a blurry shadow in a blue jumper, as I watched him walk down the path and out of the gate.
A little later, Jackie was in the living room watching TV when the phone rang. It was Mike. He said the queue at the chip shop in town was too long so hed driven back to our council estate and was calling from the public phone box at the local shops. We should get the plates and chopsticks ready because hed splashed out on an expensive Chinese takeaway. He was popping to the pub for a quick drink before heading home.
Of course. A quick drink with the change from the money Jackie gave him is likely why he didnt want me tagging along in the first place. Quick drinks had, with my dad, a habit of turning into long ones. “I got chatting to a mate,” and suddenly it was hours later and his eyes were glazed and his pores leaking booze.
Too much time passed. Emily and I were in my parents bedroom because it was the only one with a view of the back car park. It was dark, and he was really late, but it was not the first time and I didnt feel uneasy. I was on the left, leaning on the windowsill, Emily on the right, watching and waiting. Then, suddenly, something different.
“A panda car!” I said. Id recently learned that phrase and was excited to have a reason to use it. The car pulled up in the car park and a uniformed officer got out. I watched him look around probably looking for one of the houses opposite, one of the problem families. Not our family we had no problems that day.
We watched the police officer walk down the narrow path behind our row of back gardens and disappear out of sight. Our estate was a labyrinth, full of alleys and dead ends. It took about three minutes to walk from the back of our houses, down the alley and around to the front. Three minutes of hope. Three minutes of being children. Three minutes passed by, the rest of my life. There was a loud knock at the front door.
“Theres been an accident, Mrs King. Your husband has collapsed.”
The police officer at the door was a hundred feet tall. Emily and I stood behind Jackie in the doorway as he explained that he couldnt fit us all in the panda car: was there anyone who could drive us to the hospital, perhaps a neighbour or friend? Jackie made several calls and someone from our church said yes, hed come.
We were given our own waiting room. It had half a dozen hard plastic orange chairs. I sat next to Emily. My feet didnt reach the floor. Jackie paced. A doctor arrived and gently explained that Mike had collapsed and an ambulance had brought him in. He was on life support. “We believe he had a brain aneurysm,” the doctor said. “It can happen.” People walk around with a little bomb in their head for years, unknowing, until suddenly it explodes and they collapse. I imagined a cartoon bomb with a lit fuse slowly burning in my dads head, until one day today it goes boom. Did I have one, too?
“Is he going to wake up?” I said. I didnt ask if he was going to die because my dad couldnt die. That wasnt in my worldview.
The doctor spoke in a kind but sad tone. The chances of recovery were slim, he told us. If Mike did wake up, he would likely have brain damage, might be in a vegetative state for ever. My brilliant, funny, kind father. Mike, who taught us everything, including the Greek alphabet, sowing seeds of curiosity for us to nurture and, later, harvest. Mike, who did a broadsheet cryptic crossword every day, and challenged us with logic puzzles and games. Even his alcoholism was gentle, making him silly and sleepy. I imagined him in a wheelchair, drooling, being spoon-fed, not knowing who we were, in pain he couldnt articulate. My heart broke as I prayed and prayed for him to wake up and be fine.
---
The next morning, Emily and I were with our grandparents, waiting for the phone to ring. We were hoping Jackie would call and say Mike had woken up, he was OK, we could go and see him. When the phone eventually rang, my grandma Bernice answered. She talked to Jackie for a while, then put the phone down and faced us, shaken and crying.
“The doctors have asked your mom for permission to turn off life support. They said your dad is brain dead. He isnt going to wake up.”
Brain dead. I was numb with shock. Then I heard a strange, unrecognisable noise. My grandad was crying, a choking hiccup, until Bernice, also in shock, shouted, “Stop it, Symon,” in a desperate attempt to arrest the grief and potential hysteria in the room.
Over the next few days, we absorbed the news. People came and went. Church, neighbours, family. I heard the same words over and over. Brain aneurysm, ticking timebomb, life-support machine, the end. Then suddenly the atmosphere shifted as Shannon, a friend of Emilys, ran breathlessly into the house with urgent news. At the shops where Mike had collapsed there was now a police crime scene. We looked at each other. Jackie agreed we could go but told us to come straight back.
I had seen this view my entire life. The red-brick pavement, people coming and going, the telephone box where Mike had made his call. These were cordoned off in a wide area by blue and white police tape.
Shannon and Emily hung back, nervous and unsure, but I wanted to get answers. The police officer standing guard was intimidating, but I confidently approached him and tried to summon an assertive voice. “Excuse me, can you tell me whats going on here?”
“What have you heard?” he asked carefully.
“All I know is, my dad collapsed here the other night and now theres this.”
“Ah,” he said, crouching to my height, his tone shifting into kindness. “Well, were just trying to find out what happened, see if anyone saw anything.”
The three of us headed home. When we arrived, there were two strangers in the house.
The detective chief inspector had a moustache, a Welsh accent, and the largest beer belly I had ever seen. DCI Burns explained that things were not as straightforward as the hospital had first thought. All police leave had been cancelled and a team of CID officers drafted in for a manhunt. My dads death was being investigated as a murder.
Who would want to kill my dad? The answer, when it came a few days later, was as unexpected as a brain aneurysm.
A newspaper article headlined “Youths quizzed on death” claimed he had been “found slumped outside a telephone box”, a police spokesperson saying, “We are treating this as a very suspicious incident. Four boys, aged 14 to 16, are helping us with our inquiries.” Police had arrested a gang, first four, then a fifth young man, on suspicion of murder.
![Tracy King in 1989, aged 13, standing in roller skates leaning against a living room wall with floral wallpaper](https://i.guim.co.uk/img/media/6b5d775ad377e679bcf991387ffe7b34a96b72c9/66_90_1056_1213/master/1056.jpg?width=445&dpr=1&s=none)
My dad couldnt die. That wasnt in my worldview: Tracy King in 1989, aged 13, a year after her fathers death. Photograph: courtesy of Tracy King
DCI Burns returned to see if we recognised their names. Andrew Reynolds, the oldest, was unknown to us, as was one of the younger boys. Two others were former classmates of Emily. The final name, Reece Webster, was all too familiar. He lived a few doors down. The quiet, serious, under-nourished, isolated boy with intense eyes, whom Jackie shouted at when his football hit our window. We knew him, and he knew us. And now he and his friends had been arrested for my dads murder.
The “random brain aneurysm” version of Mikes death is something I might perhaps have had a chance of getting, if not over, then past something tragic but just about conceivable. But a murder is not that, not at 12, and not without a stable environment and resources. Twelve is the perfect age to feel the full, adult force of a crime but without the emotional maturity to handle it.
I got used to scouring the paper, at once desperate for and dreading any mention of Mikes name or the boys. The following week, the local paper announced the “youths” had been released on bail. As Webster lived a few doors away, and the rest not too far, the chances of bumping into one of them were high. Jackie and I had no idea what three of the five youths looked like. We could have passed them anytime. Every white teenage boy in a tracksuit jacket could have been one of them, every innocent group of lads the murderous gang.
DCI Burns told us what he believed happened that night, a story pieced together from theory and witnesses: that while Mike was in the phone box, a gang of bored youths had started to mock him. Mike went to talk to them and Reynolds, the ringleader who did martial arts, had jumped from the wall, landing an expert karate chop to the back of Mikes head, killing him instantly. Without pausing to see if he needed help, the gang fled.
DCI Burns visited a few more times. He told us the boys were insisting they were innocent and were at risk of vigilante justice. One had been cornered outside the pub and threatened by “friends of Mike”. I didnt want anyone to harm them: I wanted proper justice, through the court. How would more violence help anything? My whole family had recently converted to born-again Christianity and an-eye-for-an-eye was too Old Testament for me. I felt even more unsafe. Eventually the Crown Prosecution Service decided to proceed with a single manslaughter charge against Reynolds.
Over the next year, I fell into a serious and angry depression. Its not that I wanted to die, more that I just wanted to stop. I felt furious, rebellious and frustrated at not being heard or understood. More of an animalistic scream than a cry for help. I thought about death constantly, until it seemed like a place I could go, too. I would lie awake replaying the dramatic scene of my dads death, as vivid as if it was my own memory and not just a tableau conjured from a story heard via unreliable narrators. I thought about Reynolds jumping off that wall, hand in a karate chop, body frozen in midair.
I couldnt sleep, so Jackie took me to the doctor. I didnt mention the obsessive repeating of violent images all night, and he gave me sleeping pills. I didnt like taking them. If you get drunk or do drugs, you lose control and someone will die, I reasoned. But that was calm me. Angry me had no control whatsoever and became hysterical over the tiniest things. During one episode, I ran upstairs, grabbed my sleeping pills from the floor of Jackies bedroom where I spent my nights, and sank down in the corner, sobbing desperately.
My mom came to find me and prised the open bottle out of my hand, screaming, “Did you take them?” I refused to tell her. Even in my rage and grief I realised I wanted her to think I had. She was in hysterics herself then, and our roles shifted. I had the power. I told her I hadnt taken any pills. They were still in the bottle and the extreme frustration that had driven the whole awful thing was gone. I was left exhausted and overwhelmed by the guilt of my newly widowed mom thinking, however briefly, that her child had wanted to die, too. Our church the fire-and-brimstone fundamentalist sort who had sent missionaries from America to recruit vulnerable people on council estates suggested I was possessed, and performed an exorcism. It didnt work.
---
We had been told the trial would likely last five days. On the second day at Birmingham crown court, Emily and I settled into the waiting room chairs. We had been so primed by the police about the events of that night, I didnt expect anything but a long trial and a guilty verdict. At 13, I was too young to be allowed into the courtroom. Jackie said it was for the best anyway, as the trial would be too upsetting.
I hated those teenage boys, was petrified of them, but I had seen Reynolds parents in their distress outside the courtroom and struggled with the polices image of him as the malicious, violent gang leader. Perhaps, I reasoned, that was why the charge had been reduced to manslaughter, though this did nothing to lessen the pain of a violent death. “My dad was murdered” had been in my head for a long time. There is no equivalent phrasing for this. “My dad was manslaughtered”? Its not a thing. Someone had hit him on purpose and hed died, but that someone hadnt meant to cause his death? That didnt tally with the polices description of a malicious karate chop.
Then the courtroom doors flew open again and my entire family streamed out, livid with boiling disgust. Emily and I jumped up, confused. Someone told me that the case had ended prematurely. “The judge has thrown it out!” Reynolds was free.
Everyone around me seemed horrified at what must surely have been a grave miscarriage of justice.
I saw Reynolds from a distance as he was released into the corridor, a boy much smaller than his age, joining his parents who were visibly overjoyed as they accompanied him down the stairs and out of the building.
[skip past newsletter promotion](https://www.theguardian.com/lifeandstyle/2024/feb/24/funny-kind-father-murderous-teenage-gang-three-decades-on-i-discovered-the-truth#EmailSignup-skip-link-44)
after newsletter promotion
---
As the decades passed, I thought about the boys from the gang as little as possible. I had no feelings of anger or even blame, having long made my peace with the chaos of it all. I left religion behind when we moved away from the estate, and built a career in science communication and critical thinking. My job requires me to ask hard questions, check evidence, put bias and feelings aside and consider the facts even when doing so is hurtful. But I had never done that for the events of my fathers death. Until now.
I wondered if Reynolds had given it any thought in the years since, whether he had even seen the little girl outside the courtroom or heard the shouts of my family. I wondered what sort of person hed become.
Wed never met, so I had no real sense of him. But that wasnt true of all the boys in that gang. I had known my neighbour Reece Webster, knew he was not a bully, never teased us or called Jackie a witch, as other kids sometimes did. We played together. He was not a stranger to me before the night Mike died. Perhaps he wasnt a stranger now.
In early 2020 I found a way to contact Webster. I reassured him I wasnt harbouring any ill will or blame; I was trying to piece together a few things. He agreed to answer my questions, and we arranged a video call.
The screen flickered into life and there he was, sitting in his home. I stared at the man for signs of the boy, and was puzzled to discover I could not see him. His face was familiar, yes, but in the way that you cant figure out where you know someone from. There was just a slightly familiar, serious but otherwise ordinary man.
“Hello!” I said, putting on an upbeat tone to disguise my nerves.
“All right,” he replied. His accent was way more Brummie than mine. It surprised me, but that accent always feels like home.
I was very nervous, and the talk was small. In my career Ive worked with some extraordinary people, from astronauts to rock stars to Nobel prize winners, but this was the most challenging conversation of my life. I needed to hear what he had to say about Mikes death, but he had to relax and trust me. When it came, the story he told me was not what I expected. It was not what I expected at all.
Webster had recently turned 14, but had never been involved in a fight before. He and his friends spent most of their time playing football or video games. His mother had recently left, and his father was frequently absent.
The night of Mikes death, Webster and his friend, without anywhere else to go, headed to the shops with another boy. Theyd all had minor trouble with the police, but nothing unusual for the estate. They found themselves sitting near, but not with, another boy, also 14, who was talking to an older boy, Andrew Reynolds
“Wait. You didnt know him?” I interrupted.
“Not at all. He was nearly 18 then. He never spoke to me. I didnt know where he lived. I didnt know about his family. We didnt know anything, really.”
What happened to the marauding gang of five, the older ringleader? It was suddenly nowhere. The gang did not exist. Instead, there were five individual boys along the wall, each with their own reasons for being there.
I spent two hours on Zoom with Webster that evening and he told me his version of what happened. It was not the version I had lived with for 35 years. Instead, Webster told me about an argument gone wrong, in which my dad was not the luckless victim I had always wanted to believe. My childlike notion of heroes and baddies, good and evil, had to dissolve, to be replaced with a complex, messy, sudden insight into who my dad was when he wasnt being my brilliant father.
Reynolds not a black belt in anything did not jump off a wall and land a karate chop to the back of my dads head, but clumsily defended himself in the scuffle as my dad lunged towards him. They tried to help my dad after he collapsed. A couple of adult men came over and one told the boys they “had better scarper”, so they did. Webster was certain they would not have left the scene otherwise. And the next day the four younger boys met up; one of their dads had arranged to call the police. As none of them knew Reynolds, they did not contact him.
The four boys were arrested on suspicion of murder, held and questioned separately for several days, then released without charge (not on bail, as the newspaper had reported). Webster said that he was physically and verbally abused in custody. He shook when he said it. After he was released, he tried to go back to a normal life, but an arrest for murder sticks. His grandmother stopped speaking to him; his relationship with his parents declined even further and he was left to his own devices, not even on the radar of social services.
So much of what he said made sense, and so much of it was unbelievable. If his version was true, why would DCI Burns have told us differently? If Webster was telling the truth about that night, I had to find proof.
---
Summer 2021. I sat in the passenger seat of a car, clutching a sealed A4 envelope with “Tracy King” handwritten on the outside. Inside were the detail and facts of Mikes death. The hard proof, or as hard as I was ever going to get. A copy of the original 1988 police report. It had taken me a long time to get my hands on it.
DCI Burnss report ran through the events of that day, from the time my dad woke up at approximately 8am. Burns said he had found “no evidence to suggest he consumed alcohol on the day of his death”. There was nothing in the report about my argument with Mike. It suggested he was happy, celebratory, as he should have been, given Emily was at home. But in general he was also anxious, depressed, trying to quit drinking. The report seemed to want a definitive mood, some certainty about his state of mind. There was none to be had.
Most of it confirmed Websters version. In his witness statement he said one of the boys (not him) called Mike “a bald-headed bastard”. As a provocation, it is both absurd and banal. My dad carried a small comb and hed let me style the sparse patch that constituted his comb-over. He taught me the principles of static by rubbing a balloon on his jumper and raising those few hairs straight up like magnetic magic. But Mikes baldness could clearly be used as an insult as much as a joke, and perhaps that was what crossed the line of disrespect and caused the argument to turn physical.
Then there was the section on Mikes death. It was about the five arrested suspects and whether they committed murder. The reports conclusion was that, based on the evidence of witnesses who saw certain aspects of the dispute, and that of the suspects, they did not. DCI Burns stated he believed it was probable that Mike instigated and participated in the physical violence. Which made what Reynolds did self-defence, and its why, a year later, he was rightly acquitted.
Of all the detail in the witness statements, the paragraph that changed my perception most was this: “While these youths did momentarily disappear they returned once King had been taken away. They spoke to Smith \[one of the adults who told the boys to scarper\] who said he thought the man was dead, this caused a great panic among the youths, some were physically shaking while others cried.”
DCI Burns said in the report, “Had it not been for the irresponsible behaviour of Smith, who frightened these youths away from the scene, there is no doubt that all five would have remained at the scene to explain the situation to the authorities upon their arrival.”
The report was a time capsule in which I relived the worst version of events as they unfolded. Murder. Gang. Karate chop. The jump off the wall. It was all in there, unreliable snippets from other witnesses who admitted they couldnt really see what was going on. As I read, I saw every piece of the original story and how, together, they looked like something that they were not.
I had to accept that the version of events I, and my entire family, had lived with since 1988 was not the truth. A simple principle of critical thinking is that you cannot prove a negative. Another is that absence of evidence is not evidence of absence. I cannot prove what did happen, but I can discount what did not. The biggest clue to why we had that version of events in the first place is hidden in DCI Burnss tactful conclusion to his report. He wrote, “As it develops \[sic\], the circumstances presented themselves in a more criminal and sinister manner than perhaps they deserved.”
Burns basically admitted the dramatic murder inquiry was simply overkill. But my family didnt get the message.
In his book [The Demon-Haunted World](https://www.theguardian.com/science/2012/jul/20/demon-haunted-world-carl-sagan-review), the astrophysicist Carl Sagan admitted, “But I could be wrong.” That was the flashpoint for how I learned to think, and Im grateful for its liberating power. I had believed, sworn by and then conveniently ignored an elaborate story about Mikes death, and the truth while no less devastating and in many ways harder to live with is more mundane. Simply put, I was wrong.
---
I finally met Andrew Reynolds in person in late 2022, returning to my old home town to meet him in a pub. He seemed nervous, so I kept up a stream of reassuring chat as we got soft drinks and found a seat. We had spoken on the phone several times and I trusted him. I thought hed perhaps want to avoid the subject of Mikes death, but he jumped straight into the big talk. Reiterating what he had told me on the phone, he spoke with sincerity and nerves. It had clearly affected him deeply, his whole life. He told me barely a week had passed that he hadnt thought about it, how it all happened so quickly and how he tried, in vain, to help Mike.
I looked at his hands as we talked, thinking about how simply a man had died from being struck, and how the karate chop that never happened had haunted my psyche. We talked about how tall Mike was compared with him. I did not know my dad was tall until I read his autopsy report. He was over six feet, and the abstract image I had of their altercation suddenly came to life, my dad towering over this person in front of me.
I asked Reynolds how he felt at the time, thinking he would go to prison, and he told me how scared he had been. He remembers little about the trial, but said he saw my sister and me as he left the court. I was glad he noticed and remembered us.
He said again how sorry he was. I said I was sorry, too, but that it would all be OK. As we stood up to leave, I thought about shaking his hand, but instead opened my arms for a hug.
*Some names have been changed.*
&emsp;
&emsp;
---
`$= dv.el('center', 'Source: ' + dv.current().Link + ', ' + dv.current().Date.toLocaleString("fr-FR"))`

@ -0,0 +1,100 @@
---
Alias: [""]
Tag: ["🏕️", "🇺🇸", "🍷"]
Date: 2024-03-04
DocType: "WebClipping"
Hierarchy:
TimeStamp: 2024-03-04
Link: https://www.newwinereview.com/culture/the-many-vintages-of-the-century/
location:
CollapseMetaTable: true
---
Parent:: [[@News|News]]
Read:: [[2024-03-10]]
---
&emsp;
```button
name Save
type command
action Save current file
id Save
```
^button-TheManyVintagesoftheCenturyNSave
&emsp;
# The (Many) Vintages of the Century
**“There are years that ask questions and years that answer,” Zora Neale Hurston famously once wrote. If Hurston had been a middling wine writer rather than a giant of the Harlem Renaissance, shed likely have added: “ . . . and years that are Vintage of the Century.”**
If you pay attention to this sort of thing, were getting word from Napa Valley, via both [media](https://www.cbsnews.com/sanfrancisco/news/napa-valley-winemakers-believe-grapes-from-2023-will-produce-the-vintage-of-a-lifetime/) and [industry](https://napavintners.com/napa_valley/vintage_charts.asp), that 2023 is the “[vintage of a lifetime](https://wineindustryadvisor.com/2023/12/04/2023-predicted-to-be-the-vintage-of-a-lifetime-in-napa-valley).” No less an authority than Karen MacNeil, author of *The Wine Bible*, recently took to [YouTube](https://www.youtube.com/watch?v=oOTVzTdY8QM) to announce, “I have no doubt that 2023 will go down as one of the most phenomenal vintages ever in Napa Valley.” [Napa Vintners](https://napavintners.com/napa_valley/vintage_charts.asp) reports that winemakers are raving about 2023s “freshness, purity and elegance” following whats reported as the “longest Napa Valley growing season in a decade.”
Forgive me if this feels like déjà vu all over again. Just three years ago [in Vinous](https://vinous.com/articles/napa-valley-s-thrilling-2018s-2019s-jan-2021), Antonio Galloni raved about Napas “two stunning back-to-back vintages in 2018 and 2019, the likes of which I have never seen.” Consulting your trusty [Wine Spectator vintage chart](https://www.winespectator.com/vintage-charts/region/california-cabernet-napa), we can see that Napa Valleys 2018 vintage was rated 99 points and 2019 was rated 97 points, this followed 2016 being rated 98 points. At the turn of the 20th century, Wine Spectator declared 1997 as the “[vintage of the century](https://www.winespectator.com/articles/californias-vintage-of-the-century-12364),” also rated 99 points on its chart. So, with all things being equal, if 2023 is indeed the “vintage of a lifetime”—and if scores and vintage charts matter—we might reasonably assume that Wine Spectator will have to bestow a perfect 100 points on the year, right? Hell, why not 101? 
### **Vintages of the Century in BordeauxAgain and Again**
Meanwhile, during just the first decade of the 21st century, Robert Parker declared three Vintages of the Century in Bordeaux, starting with 2005 (“the perfect vintage” he wrote). That was followed by 2009, which most other critics proclaimed to be Vintage of the Century. Then the very next year, 2010, was also a Vintage of the Century. Then, depending on who you spoke with and when, [2016](https://www.the-buyer.net/tasting/wine/fowler-2016-bordeaux/) might also have been a Vintage of the Century. Also, allegedly, [2018](https://www.prestigeonline.com/hk/lifestyle/wine-plus-dine/is-2018-bordeaux-the-superlative-vintage/), [2019](https://www.jancisrobinson.com/articles/bordeaux-2019-best-ever), and [2020](https://www.wine-searcher.com/m/2021/05/vintage-2020-bordeaux-rolls-out-another-classic). 
With [Bordeaux](https://www.newwinereview.com/what-to-drink/what-five-experts-have-to-say-about-buying-2022-bordeaux-en-primeurs/), apparently, the only real yardstick is whether its a Vintage of the Century or not. Vinous headline for its report on the poor 2013 Bordeaux vintage: “[Definitely Not the Vintage of the Century](https://vinous.com/articles/bordeaux-2013-definitely-not-the-vintage-of-the-century-may-2014).” Académie du Vin Library had this to say about [2022 Bordeaux](https://www.newwinereview.com/what-to-drink/2022-bordeaux-vintage-questions/): “Im not saying its another vintage of the century, but it was an extraordinary year all the same.”
Back in 1982, the *New York Times* wine critic Terry Robards wrote “*oenophiles on this side of the Atlantic have grown accustomed to the French phenomenon known as the Vintage of the Century. . . The French, who are not only intrepid wine makers but good businessmen as well, have recognized the commercial value of declaring such a vintage from time to time.*” This is Robardss set-up to calling nonsense on Bordeauxs 1959 vintage (“not as great as the 61s”), which had previously been given Vintage of the Century status. Of course, not long after Robards wrote this column, 1982 was declared Vintage of the Century, by Robert Parker.
![](https://i0.wp.com/www.newwinereview.com/wp-content/uploads/2024/02/Screenshot-2024-02-27-at-10.25.58-AM.png?resize=910%2C924&ssl=1)
Is this where it all began?
I wish I loved anything as much as people in the wine industry love to toss superlatives at grape harvests, years before anyone will actually drink the wine. And I wonder, as the world of wine undergoes a generational shift, whether the hyper-focus on “best” vintages is helpful at all. Rating vintages too often becomes reductive shorthand, and risks alienating potential wine lovers with another form of gatekeeping and exclusivity in wine that consumers, over and over, say they dislike.
Certainly, some of this is just good fun. Who doesnt love arguing over who or what is best: Michael Jordan, LeBron James, or Kobe Bryant? French, Italian, or Japanese food? Prada versus Gucci? Black Sabbath or Led Zeppelin? High-end collectors surely love disputing whether 1996 or 1997 Barolo was Vintage of the 20th Century. Or whether 2005, 2010, or 2016 Châteauneuf-du-Pape is Vintage of the 21st Century. (Lucky you, if you can afford the bottles that merit these particular debates). 
### **“Bad” VintagesBut For Whom?**
Let me be clear. I believe in vintage variation. Im not a vintage denier. Of course, different weather and conditions in different years produce different results. But theres too much emphasis on declaring good and bad vintages, and too much of the wine business—from producer to importer to merchant—revolves around this sort of prognostication.
Kara Daly, in her newsletter [Wine Is Confusing](https://wineisconfusing.substack.com/), recently published a two-part series that expressed skepticism on vintage talk (“[A Case for Buying Bad Vintages](https://wineisconfusing.substack.com/p/a-case-for-buying-bad-vintages-pt-b55)”). Daly argues that a focus on declaring vintages “good” and “bad” flattens the dialogue about wine, and isnt particularly engaging for most consumers. In her piece, Oregon winemaker [Brianne Day](https://www.daywines.com/) sums it up nicely: “Our job is not just to take perfect fruit and make good wine out of it. Thats a pretty low bar. Our job is to make good wine every vintage, and vintage variation is one of the cool things about wine.” I appreciate this approach, because it looks at wine as an object of culture, always with the potential of producing something interesting or noteworthy, regardless of subjective evaluations of simply whats good or bad.
The problem with declaring “good” and “bad” vintages should always beg the question: Good or bad for whom? From a growers perspective, a bad vintage might be one in which they lose a significant portion of their fruit to [frost](https://www.wineenthusiast.com/culture/industry-news/france-frost-wine-climate/) or [drought](https://www.winespectator.com/articles/spanish-winemakers-confront-record-drought-conditions). But that same vintage, because of its low, concentrated yields (not to mention its scarcity) might become a darling of critics and sommeliers.
> The problem with declaring “good” and “bad” vintages should always beg the question: Good or bad for whom?
Then there are subjective matters of taste. Many among the veteran generation of critics who still set our wine agenda still favor hedonistic wines from warmer, riper vintages. Are those always the “best” vintages? I tend to love cooler, subtler vintages, ones that certain wine people would call “underripe.” Neither sides preference is an indication of whats “best.” But, as Robards pointed out in 1982, Vintages of the Century are good for business. In a world of good and bad vintages—with many years of aging required before we truly know the quality—an entire ecosystem of explainers, interpreters, diviners, and hype men has evolved. Its hard to even imagine a wine world without all this hot air.
### **Where Theres Never A Vintage of the Century**
Meanwhile, such Vintage of Century rhetoric is never applied evenly. When have you heard the wine world talk of a Vintage of the Century in the Loire Valley? They certainly have vintages in the Loire. Some are better than others. Those of us focused on the region know about its string of good vintages from 2015 to 2018. There is some chatter about whether 2015 or [2018](https://www.wine-searcher.com/vintage-2018-loire) is “exceptional” or “legendary,” but no one was beating their chests about either being a Vintage of the Century. 
In fact, theres often been a critical bias against Loire, a subtle dismissal from big-time critics. In Wine Spectators [trusty vintage chart](https://www.winespectator.com/vintage-charts/region/loire), no Loire cabernet franc or sauvignon blanc vintage from the past 20 years has ever been rated higher than 92. How is that possible? Meanwhile, in Bordeaux, 11 vintages from 2002 to 2022 are rated 93 points or higher. These are the ways in which gatekeepers maintain a hierarchy in wine.
![](https://i0.wp.com/www.newwinereview.com/wp-content/uploads/2024/02/D96173F5-6C6A-4113-95F5-3E4840F3DA26_1_201_a.jpeg?resize=1024%2C576&ssl=1)
Critics from around the world tasting the 2014 Brunello vintage in Montalcino, Italy.
With prestige regions, where the investment of collectors is on the line, its uncanny how often a Vintage of the Century comes along—and so often at just the right moment. Take [Brunello di Montalcino](https://www.newwinereview.com/what-to-drink/what-you-need-to-know-2018-2019-brunello/). Brunello became a darling of collectors in the late 1990s and early 2000s. (There had been debate over whether [1997 or 1999](https://vinous.com/articles/1999-brunello-di-montalcino-sep-2004) was a Vintage of the Century.) But by the early 2010s, Brunello was not in a good place. First, there was the [Brunellopoli](https://en.wikipedia.org/wiki/Brunellopoli) scandal of 2008, in which some [Brunello](https://www.newwinereview.com/what-to-drink/brunello-buying-guide-2/) producers secretly—and illegally—added grapes other than Sangiovese to increase production.
Then came a few middling vintages. I remember arriving at the grand tasting in Montalcino for the release of the 2014 Brunellos. Early grumbling had already labeled 2014 as “challenging,” which is the wine worlds euphemism for “shitty.” We were to taste all day, through dozens of wines, at our own pace. I arrived at the event about an hour after the doors opened and sat down. Before I had even taken a sip, or written a note, an American wine writer I knew waved, came over and, by way of greeting, said, “Ah, I cant believe you came all the way over here to taste the 2014s. Theyre shit.” Apparently, hed already tasted more than 100 wines in the previous hour, and already rendered his judgment. I dont know what he did with the rest of his work day.
So, after that “challenging” Brunello vintage of 2014, what happened next? Well, its the darnedest thing, but 2015 was a Vintage of the Century! And so was 2016! Just ask sources like [James Suckling](https://www.jamessuckling.com/wine-tasting-reports/brunellos-greatest-vintages-ever-2016-2015/), [K&L Wine Merchants](https://onthetrail.klwines.com/on-the-trail-blog/2019/11/21/brunello-2015vintage), and the [Wine Spectator](https://www.winespectator.com/vintage-charts/region/tuscany-brunello-di-montalcino), which all rated Brunello di Montacinos 2015 vintage as 97 and 2016 as 99.
![](https://i0.wp.com/www.newwinereview.com/wp-content/uploads/2024/02/doennhoff-weingut-1-2.jpg?resize=1080%2C1080&ssl=1)
Legendary winemaker Helmut Dönnhoff (with his son Cornelius), who shies away from Vintage of the Century talk. (Credit: Dönnhoff)
Im not saying that 2015 or 2016 arent fine vintages. Well have to wait and see as people start opening and drinking those Brunellos over the next few years. More broadly on this point, I stand with famed Nahe winemaker Helmut Dönnhoff. When [speaking with Vinous](https://vinous.com/articles/germany-2009-everybody-s-darling-jan-2011) about Germanys excellent 2009 vintage, Dönnhoff pleaded: “Please, lets not talk about a vintage of the century. I am tired of superlatives. Why does everyone want to put the cart before the horse? Well only know in a few years how these wines have developed.”
Because the biggest issue with overheated Vintage of the Century talk is how often it turns out to be wrong. Yes, some of this is the fun of predicting and debating. But the great mystery and beauty of wine is we never really know how it will age. Its curious how rarely you see wine media revisit vintages theyve declared as good or bad. In the rare instances when you do see [older vintages revisited in print](https://v1.vinous.com/articles/a-test-of-greatness-2009-bordeaux-ten-years-on-march-2019), its usually for the critics to give themselves a self-congratulatory pat on the back for their predictions.
Once several years have passed, the people who bought “Vintage of the Century” wines, and stashed them away in their cellars, are pretty much on their own. Long after the initial excitement dies down, you often only hear about vintage quality through gossip or on [online forums](https://www.wineberserkers.com/t/what-vintages-do-you-think-that-you-totally-botched/98674). *Did the* [*2005 Burgundy vintage*](https://www.theguardian.com/lifeandstyle/2007/jan/28/foodanddrink.shopping3) *really live up to its hype?* *Was 2019 in the Wachau really as good as 1999 or 2009? Is the 2003 Napa vintage really as bad as they said?*
But by the time those who bought the bottles start asking these questions, the Vintage of the Century folk have washed their hands of them. Theyve moved on to the next Vintage of the Century.
&emsp;
&emsp;
---
`$= dv.el('center', 'Source: ' + dv.current().Link + ', ' + dv.current().Date.toLocaleString("fr-FR"))`

@ -0,0 +1,194 @@
---
Alias: [""]
Tag: ["🤵🏻", "🇨🇦", "🎓", "🤥"]
Date: 2024-03-04
DocType: "WebClipping"
Hierarchy:
TimeStamp: 2024-03-04
Link: https://torontolife.com/deep-dives/gill-sisters-pretendian-fraud/
location:
CollapseMetaTable: true
---
Parent:: [[@News|News]]
Read:: 🟥
---
&emsp;
```button
name Save
type command
action Save current file
id Save
```
^button-Howtwofaux-InuitsisterscashedinonalifeofdeceptionNSave
&emsp;
# The Great Pretenders: How two faux-Inuit sisters cashed in on a life of deception
Amira and Nadya Gill were well-known on the Queens University campus. The ambitious twins seemed to excel at everything they did. Amira was pursuing her masters in civil engineering, and she was a reservist in the Canadian Armed Forces. Nadya, a former NCAA soccer player, juggled her duties as an assistant coach for the womens soccer team with law school, and she was an associate editor for the *Queens Law Journal*, a board member for the schools student law society and co-host of a legal podcast. Throughout their studies, they won a number of awards and scholarships. And everyone knew they were Indigenous, a status they wore with pride.
Amira spent much of her spare time on a dorm floor dedicated to Indigenous students. During Indigenous awareness events, she was front and centre at various activities and seminars, wearing her purple varsity jacket and helping to educate her fellow students. She could be angry too, sometimes complaining bitterly about “the white man” and the destruction wrought on her people.
Nadya rarely joined her sister in such public conversations about the Indigenous experience—although she benefited just as much from their professed Indigeneity. One summer, she attended the University of Saskatchewans Indigenous Law Centre program. Her placement was paid for by a grant from Indspire, a national charity that helps fund education for First Nations, Inuit and Métis students.
But an acquaintance who spent time with both sisters at Queens remembers some details that didnt quite make sense. Amira enjoyed her classmates attention and often sought the spotlight. She frequently bragged about her familys wealth and how her parents paid for her many expenses, though the friend never saw those wealthy parents on campus. Amira liked to jangle her Tiffany bracelet in front of the younger students, but otherwise she owned no designer clothes, rare sneakers or shiny tech. Plus, both sisters were residence dons, a role usually filled by kids who need financial support: dons get free room and board in exchange for their duties.
***Related:** [A crooked cop, a dead man and an $800,000 estate fraud](https://torontolife.com/deep-dives/crooked-cop-dead-man-fraud-robert-konashewych/)*
Other inconsistencies also struck their classmates as odd. Amira often spoke about the importance of trust and credibility in a student leader like herself, yet one former classmate remembers her applying for emergency benefits during the pandemic despite her family wealth. She was sure the government would never ask for it back, she said, so why not? It seemed like easy money.
The twins may have been fiercely proud of their Indigenous identity, but neither sister spoke in much detail about their heritage. Some of their scholarships and awards identified them as Inuit. But where in Nunavut were they born? What was life like back home? When did they leave and come to Ontario? What traditions did they observe? When asked, the twins would say something about their connection to the North being through their mother and then artfully change the subject. If anyone found their secretive attitude strange, few thought to call them out on it. And for years nobody—not fellow students, not teachers, not the organizations that gave them thousands of dollars in Indigenous grants—suspected the truth.
In all of the Gill sisters lies, there was one kernel of truth: their mother, Karima Manji, had lived in Iqaluit in the early 1990s. Manji, a slender woman with a heart-shaped face and large eyes, was born in Tanzania and came to Canada as a child. In her 20s, she went north to work for Frobisher Development Limited, a residential and commercial real estate company now known as Nunastar. One of her colleagues was Harry Hughes, a single father who had seven children with a woman named Kitty Noah. He and Noah were separated, and Hughes and Manji soon started dating.
Noah Noah is one of Hughess sons and the eldest of his children with Kitty. He was 10 years old when he first met Manji, and he remembers her as cold, controlling and prone to angry outbursts. When Noah was 11, his father was hospitalized in Iqaluit with bone marrow cancer. Manji was adamant that no one else visit Hughes—not even his children or his best friend. She frequently tended to the children and seemed to resent them. Noah remembers her telling Hughes that he and his kids “belonged in the sewer.”
Hughes and Manjis relationship was strained and short-lived. In 1992, Hughes left the North and relocated his family to Horseshoe Valley, Ontario, in search of better opportunities for his children. Manji moved as well, but to Toronto. Though no longer together, the two kept in touch right up until Hughess death, in 1997, at age 57. After that, Noah, then 17, lost touch with Manji and assumed he would never hear from—or about—her again.
Manji started life anew in the GTA, where she met and married a man named Gurmail Gill, the vice-president of a spring manufacturer in Mississauga. Gills family came from India, and he had British citizenship. Together, he and Manji lived in a tidy bungalow on a street lined with mature trees in Etobicoke. The couple welcomed their first child, a boy they named Liam. At home, Manji rarely spoke in detail about her time in Iqaluit, and understandably so: it had been only a blip in a life that started in Tanzania and would play out in Toronto.
When Liam was a toddler, Manji began working for March of Dimes Canada, a non-profit housing corporation that provides shelter and care for people with disabilities. As a part-time property manager, Manji conferred with tenants, ordered equipment and ensured repairs were made. Her colleagues liked her and believed that the organizations tenants did too. Manji came across as capable and unflappable. If a tenant was challenging, or if someone couldnt keep up with their rent, everyone trusted Manji to take care of it.
She also cultivated the image of a thriving home life and bragged about renovating her house. They needed the space: Manji was pregnant again, this time with twin girls. The office celebrated with a baby shower. Manji spoke glowingly of her marriage, but behind the scenes, the couples relationship was rocky. They fought often and separated more than once. In September, Manji gave birth to Nadya and Amira. Over the years that followed, the three Gill children grew to resemble their parents: dark skin and hair, large round eyes and wide smiles.
![The Great Pretenders: How two faux-Inuit sisters cashed in on a life of deception](https://torontolife.com/wp-content/uploads/2024/02/GILL_SISTERS_FINAL05-368x0-c-default.jpg "Gill sisters school photo")
Amira and Nadya Gill went to high school in Etobicoke. Amira excelled in math, and Nadya became a sports superstar
The twins excelled in school and, in 2011, began Grade 9 at Michael PowerSt.Joseph High School, in Etobicoke. While there, they participated in a government-funded exchange program that allowed non-Indigenous city kids to immerse themselves in the lives of an Indigenous community. Pinehouse is a village of about 1,000 people, five hours north of Saskatoon. For a week, Amira, Nadya and a dozen of their fellow students were billeted by the locals, attending class and being introduced to Métis and Cree culture. I spoke to two students who participated in the program, and neither remembers either sister mentioning, publicly or privately, any Indigenous connections.
No one I spoke to remembers them mentioning it as they moved through high school either. Mostly, Nadya was focused on sports. In 2013, her team won silver at an international youth soccer tournament in Jamaica. The next year, she represented Canada at the FIFA U-17 Womens World Cup in Costa Rica. In 2015, at age 16, she received a scholarship to Quinnipiac University in Hamden, Connecticut, and was among the youngest NCAA athletes to play soccer. While Nadya excelled on the field, Amira set her sights on the classroom. She left home the same year as her sister and headed to Queens to study engineering. Liam, meanwhile, was in the UK studying at Durham University. None of the Gill children were living at home when ­Manjis lies caught up with her.
In the summer of 2015, a March of Dimes employee noticed something strange: two packages—a fridge and a barbecue—delivered to one of the apartment buildings the organization managed had been redirected to Manjis home. The organization investigated her purchases and discovered a series of odd transactions. Manji had bought several big-ticket items on behalf of the charity, returned them and pocketed the refunds. In some cases, shed simply bought expensive items for herself. ­Manjis bosses contacted a lawyer, then the police. They fired her, and March of Dimes demanded she repay $25,000. She refused, claimed innocence and lawyered up. Her former employers, expecting contrition and a quick resolution, were puzzled by her response and decided to launch a full forensic investigation.
***Related**: [Meet the most charming fraudster in GTA real estate](https://torontolife.com/deep-dives/the-most-charming-fraudster-ontario-gta-real-estate/)*
The results were shocking. For years, Manji had been over-ordering anything and everything—Christmas turkeys, supplies from hardware stores, ­refrigerators—so she could return the extras and keep the cash. The organization also discovered shed been bullying tenants to pay for repairs and other necessities that the organization was supposed to cover, and then keeping the money intended to pay those bills. Over the years, shed bilked the organization not for $25,000, as originally estimated, but for $800,000. In November of 2015, police arrested Manji, then age 50. They charged her with fraud, forgery, theft and possession of property obtained by crime. Her family would have seen the extensive news coverage and Manjis grim mugshot published alongside each article.
In 2016, Manji was given a conditional sentence and ordered to serve two years under house arrest. She and Gill separated again, this time for good. She got a minimum-wage job at a dry cleaners and moved into an apartment in the back. March of Dimes recouped some money from their insurance company, and Manji repaid more than $500,000—even selling some of the familys furniture to come up with the cash. But, rather than being chastened after getting caught, Manji seemed as emboldened as ever. She was still under house arrest when she hatched her next swindle. This time, shed need to involve her daughters.
The “pretendian” phenomenon in Canada can be traced back to at least the 1930s, when Archibald Stansfeld Belaney donned leathers, renamed himself Grey Owl and began telling people his mother was Apache. He used his new identity to amass fame and fortune as an Indigenous author and conservationist. But the term itself didnt gain traction in Canada until late 2016, when Indigenous journalists started pointing out the inconsistencies in bestselling author Joseph Boydens proclaimed Indigenous roots. Today, its used to broadly describe fakers who claim to be Indigenous but arent. (Some Inuit also use the term “pretenduit” as a way to address the specific co-opting of their heritage and culture.)
The list of high-profile Canadians busted for faking Indigenous identities has grown alarmingly long in recent years and includes academics, judges, professors and cultural icons. In October 2021, a CBC investigation revealed that Carrie Bourassa, a University of Saskatchewan professor, had falsely claimed to be Métis, Anishinaabe and Tlingit. In 2022, media raised questions about former judge Mary Ellen Turpel-Lafonds purported Cree ancestry; she has maintained her ­Indigeneity but later lost her Order of Canada, among other awards. Last year, Memorial University removed Vianne Timmons from her role as the schools president after a CBC report challenged her claims of Mikmaw heritage. And in one of the most explosive revelations to date, *The* *Fifth Estate* reported last October that 82-year-old singer and activist Buffy Sainte-Marie had lied about being a Cree survivor of the Sixties Scoop.
The problem is especially prevalent in Canadian academia, where the allure of money and status runs high. Universities have been under pressure to increase Indigenous student admissions—as of 2021, only 13 per cent of Indigenous people of working age had a university degree—and hire more Indigenous faculty. In their rush to boost their numbers, many institutions have overlooked the potential for scammers. Jean Teillet is a recently retired Métis lawyer in Vancouver who has worked on Indigenous-identity fraud cases. In the wake of the Bourassa scandal, the University of Saskatchewan hired Teillet to write a report on Indigenous-identity fraud, complete with recommendations on how to spot it. While some institutions are now introducing mechanisms to confirm membership in a recognized nation, including the presentation of official status documents, Teillet found that, for many applicants, claiming Indigeneity is as easy as ticking off a box. Universities are largely ignorant about the complexities of Indigenous identity, and theyre either too gullible or willfully blind to dubious claims.
There are two kinds of fraudsters, according to Teillet: fabricators who invent Indigenous identities whole cloth and embellishers who exaggerate some perceived connection. Some embellishers bolster their claims using the results of DNA tests showing small percentages of Indigenous heritage. Others exploit unverified family stories about a distant Indigenous relative. Whatever kind of identity fraud theyre engaging in, they generally lie to get ahead professionally. Maybe they want an Indigenous award or grant or acceptance into networks that are closed to them. Such fraudsters exploit affirmative action initiatives or diversity, equity and inclusion protections, says Teillet. As an Indigenous applicant, the person could be accepted into law or medical school when theyd otherwise be rejected. And sometimes, the motivation is even simpler: “They want something that makes them unique and different, and this gives them a chance to say theyre special,” Teillet says.
Manji seemed to believe that her daughters were entitled to it all: the cash, the prizes, the attention. And she spied a potential pathway for them in her distant history in the North. Indigenous peoples in Canada are grouped into three categories: First Nations, Métis and Inuit. Each group has different processes for gaining status, enrolment or citizenship—as well as access to funding opportunities. Unlike First Nations people, Inuit and Métis are not entitled to registration under Canadas Indian Act, which lays out certain educational, tax and other subsidies. They are, however, eligible for scholarships, bursaries, awards and additional assistance set aside for Indigenous people.
![The Great Pretenders: How two faux-Inuit sisters cashed in on a life of deception](https://torontolife.com/wp-content/uploads/2024/02/GILL_SISTERS_FINAL06-scaled-368x0-c-default.jpg "Gill sisters fishing")
In Grade 9, the Gill twins visited Saskatchewan to participate in a program that teaches non-Indigenous students about Indigenous culture
For Inuit who are from Nunavut to access such assistance, they must be enrolled in the Nunavut Agreement of 1993, which recognizes the vast land as their traditional territory. Successful enrolment comes with certain rights, including the ability to vote in local elections, supplementary health benefits, the use of Inuit-owned lands, and—perhaps most importantly for Manji and her ­daughters—eligibility for various grants and bursaries. To gain enrolment, Inuit must apply through Nunavut Tunngavik Incorporated, the organization responsible for ensuring that the terms of the Nunavut Agreement are carried out. The NTI requirements are fairly simple: the applicant must be a Canadian citizen, they must be Inuit according to Inuit practices and usages, and they must identify as Inuit. Those living outside of Nunavut can apply, as can those whove been adopted by non-Inuit parents.
Manji must have figured she would have a greater chance of success if she claimed that her girls were adopted. The Adopted Inuit Children form is a two-page document that asks for basic information about the applicant, their birth parents and their adoptive parents but does not require any specific supporting documentation. Manji filled out a form for each of her two daughters. On them, she claimed that she and Gill were Amira and Nadyas adoptive parents—a blatant lie. Under “birth parent,” she wrote the name of a woman in Iqaluit.
The forms that come through the NTI are sent to community enrolment committees for review. Every community in Nunavut has a committee of Inuit who are residents of the area. These committees meet at least every six months to review the claims of those seeking status. The forms that come through the NTI are sent to community enrolment committees for review. They rely heavily on their own community ties and knowledge to assess the applications, and in the cases of adopted children, they may reach out to the listed birth parents.
***Related:** [Inside a sophisticated identity theft scheme that may have conned Torontonians out of millions](https://torontolife.com/city/name-johnson-chrome-hes-citys-wanted-identity-thief/)*
Manji must have hoped no such attempt would be made, but she hit an unexpected snag: the woman shed listed on the twins applications happened to be on the review committee. The applications were quickly rejected, but Manji was undeterred. In October 2016, just a month after Amira and Nadya turned 18, she filled out another set of applications requesting enrolment for her daughters. This time, she came up with a different name for their birth mother: Kitty Noah, the mother of Noah Noah and ex-partner of Harry Hughes.
![The Great Pretenders: How two faux-Inuit sisters cashed in on a life of deception](https://torontolife.com/wp-content/uploads/2024/02/GILL_SISTERS_FINAL07-368x0-c-default.jpg "Kitty Noah")
Kitty Noah didnt know Amira and Nadya Gill. That didnt stop their mother from using Noahs name to secure the girls Inuit enrolment. Photo courtesy of Noah Noah
At the time Manji submitted her second application, Kitty was homeless. For much of her life, Kitty had struggled with alcohol abuse, and she moved around frequently. At one point, she was living in a shack on a cold Iqaluit beach. Her situation worsened in 2006, when she was struck by a car and suffered a brain injury. Noah moved back to Iqaluit in 2007 and now works in Crown-Indigenous Relations and Northern Affairs Canada. He helped care for his mother through a guardianship, but she never fully recovered. “She had the mental capacity of a 16-year-old,” says Noah. “She couldnt make a safe decision to save her life.”
Noah says the NTI later told him that members of the enrolment committee had tried to reach Kitty to confirm Manjis claim but couldnt. They didnt reach out to him or any other members of the family. But the committee in Iqaluit did know that Kitty had what Noah called “a pile of children.” According to him, that—and the absence of any objection from Kitty—was enough to green-light Manjis application.
Its unlikely that Manji told her daughters they were Inuit by birth. After all, if she had suddenly dropped the thunderous news that they were adopted, surely the girls—and the rest of the Gill family—would have been puzzled. How to explain, say, photos of her pregnant with twin daughters? Or the striking resemblance they bore to the rest of their family? Or the fact that they didnt look in any way Inuit? A source close to the family suspects the most likely theory is that, after living in Iqaluit and helping to raise Kitty Noahs children, Manji felt she deserved the same benefits as any Inuk. And that concocted honorary status extended not only to her but to her daughters.
Amira cashed in first. In 2017, she won what was then called an Aboriginal Student Award from RBC to continue her undergraduate studies at Queens—­something she presumably would have had to apply for just months after her mother submitted the application for Inuit enrolment. The award was worth as much as $4,000 per year of post-­secondary education, and she was one of just 10 recipients—meaning an Indigenous student was almost certainly rejected. The bank gleefully promoted the honorees, producing a community handout with Amiras headshot next to the word “Inuit.” Amira also won a Hydro One scholarship reserved for Indigenous students. The award—in recognition of a retired federal judge and leader in efforts to Indigenize Canadas legal system—was worth $5,000, and only 15 were granted.
The process must have seemed so easy to Manji. She had claimed that her daughters were Inuit without providing a trace of proof, and it worked. So in 2018, she tried for herself, claiming that she, too, had been adopted by two Inuit from Iqaluit, but the claim was rejected.
During those first years of the twins new identities, Nadya got by on her athletic prowess alone. After completing a bachelor of science in business management at Quinnipiac, she moved on to West Virginia University, again on an athletic scholarship, where she completed a masters of sports education. In 2019, she headed to Queens for law school. Though she was hired on as an assistant coach, she no longer had any sports scholarship money. Now, she also had a reason to benefit from her mothers scam. In 2020 and 2021, both twins received bursaries from Indspire. With their enrolment cards in hand, a new world had opened to the Gill sisters.
As Amira and Nadya neared graduation and aged out of the grift that had kept them going for years, they transitioned from Inuit wunderkinds to inspiring Inuit entrepreneurs. In late 2020, Manji and her daughters started an online business, Kanata Trade Company, with Manji as CEO and the twins as the face of the brand. The companys website described Nadya and Amira as “twin Inuit sisters.” Kanata sold goods designed by Indigenous artists and claimed that it planned to donate 100 per cent of its profits to Indspire, while retaining some cash “to grow our business and pay our staff.” An Indspire article commending the “dynamic sisters” noted that they wanted to give back to their community and help other Indigenous students. Kanata was even certified by the Canadian Council for Aboriginal Business.
During the pandemic, the business first sold cloth masks printed with designs by Indigenous artists including Tracey Metallic, Francis Dick and Norval Morrisseau. Kanata didnt work directly with the artists but instead bought the masks from a Scarborough-based wholesaler that licenses work from Indigenous artists and uses it to create a wide variety of goods, such as umbrellas and jigsaw puzzles. Soon, Kanata was also selling baby bibs, art cards and eco-friendly totes—all emblazoned with colourful depictions of animals, nature scenes or figures in traditional dress. Kanatas website implored people to do the right thing, noting that Indigenous communities had been disproportionately affected by the pandemic. The Residence Society at Queens University bought 100 Kanata masks at a cost of $1,850. “Im grateful,” Amira told the *Queens Journal*. “They contributed a large amount thats going to help another Indigenous student go to University.”
![The Great Pretenders: How two faux-Inuit sisters cashed in on a life of deception](https://torontolife.com/wp-content/uploads/2024/02/GILL_SISTERS_FINAL08-scaled-e1707412684207-368x0-c-default.jpg "Nadya Gill soccer photo")
Nadya Gills soccer skills earned her athletic scholarships. Once they ran out, she needed a new revenue stream. Photo courtesy of the *Quinnipiac Chronicle*
With Kanata, the Gill sisters had found not just a new source of income but a potentially prosperous twist in identity. They were no longer the beneficiaries of social programs, graciously accept­ing a leg up wherever it was offered. Now, they were the benefactors—20-something entrepreneurs using their education and personal experience to give back. They hustled around this new persona, appearing in media interviews to promote their venture. In July of 2021, they participated in a “Coffee, Career and Conversation” session with other ambitious young panellists, hosted by the United Nations Associations young entrepreneurs program.
Just as she had during their time at Queens, Amira leaned harder than Nadya into this new role. In May of 2021, she appeared on *Soul Sister Conversations*, a podcast about connecting with ones “authentic self,” after reaching out to the host, Dana Lloyd. A poised Amira said that she and Nadya hoped to use their business to inspire Indigenous students to finish their post-secondary education. She expressed gratitude for the help theyd received from Indspire and credited the non-profit with being responsible for their “fulfilling” post-secondary experience. Not only had Indspire provided scholarship money, she stressed, but its staff had regularly checked in with the twins to help them feel, as Amira put it, safe and at home.
When asked, she explained that the sisters named their company Kanata because its “a native word for Canada,” repeating a common misunderstanding. (*Kanata* is an Iroquoian word for “village”; the leading theory is that early colonizers wrongly assumed it to be the name for the nation to which they had arrived.) Amira noted that their business was also trying to shine light on what she called “the missing and murdered Indigenous women aspect.” Throughout the interview, she said nothing of her own experiences as a young Inuit woman. When referring to Indigenous students and communities, she used “they,” never “we.” Near the end, Lloyd asked her how Kanata brought her closer to her authentic self—a clear prompt to share her experiences as an Indigenous person. Instead, Amira said that shes the kind of person who likes to give back.
![The Great Pretenders: How two faux-Inuit sisters cashed in on a life of deception](https://torontolife.com/wp-content/uploads/2024/02/GILL_SISTERS_FINAL09-368x0-c-default.jpg "Gill sisters")
Amira graduated from Queens in 2021 with a masters in civil engineering. Nadya followed the next year, with a law degree. Photo via Instagram
Soon, word of the extraordinary Gill sisters began to reach Inuit circles on social media­—and many found the twins story more far-fetched than inspiring. Because the mechanisms—and motivation—for detecting Indigenous-identity fraudsters are so lacking in Canadian institutions, Indigenous people often take up the task of weeding out fakers themselves. They do most of their sleuthing online, monitoring supposed Indigenous businesses and individuals for suspicious claims of ancestry. Theyre usually looking for shifting or contradictory accounts of heritage, and when they find them, they share their evidence on social media—sometimes with one another and sometimes directly confronting the suspected fraudster. By late 2021, a number of Indigenous sleuths were growing suspicious of the Gill sisters. Canadas Inuit population is small—just 70,000. If these sisters who seemed to be taking on the world were, in fact, Inuit, how was it possible that no one else in Inuit circles had any connection to them, or had even heard of them before now?
One of these amateur detectives was Barbara Akoak, an artist in Iqaluit who goes by “Inuk Barbie” online. “I immediately knew they were fake,” she said after seeing a CTV story about Kanata. Their impressive academic pursuits, as described in the article, would have been the talk of Iqaluit. “We all know who wants to go to law school before they go to law school,” she said. When Akoak did a little digging, she found the Indspire brochure touting the twins accomplishments. But instead of identifying their community, their people, they were simply identified as “Nunavut Tunngavic.” It was more than odd, thought Akoak, that someone would claim to be from an Inuit organization.
Posts from her and other Inuit skeptical of the twins claims eventually reached Gabriel Zarate, a former freelance journalist in Nunavut whod left the territory in 2012 and was friendly with Akoak. Zarate started doing some digging of his own. He quickly found an online sports biography for Nadya, claiming her birthplace as Mississauga. The more he read about the twins, the more their stories didnt add up. So he began to respond to social media posts about the twins, hoping to pressure them into revealing the truth.
On October 14, 2021, he replied to a tweet that recommended Kanatas masks, remarking: “Owned by non-Indigenous who are faking it.” On December 22, 2021, he replied to a tweet promoting Amiras *Soul Sister* appearance: “Nadya and Amira Gill are fraudsters taking advantage of the white inability to tell brown folks apart. They arent Indigenous, they are Punjabi-Canadian.” And on February16, 2022, he posted: “Kanata Trade Co. bills themselves as Inuit-owned. It is a lie.” Six months later, Zarate reached out to the Canadian Council for Aboriginal Business and informed them of his suspicions. He received a stern rebuff. “Amira has provided us with her Inuit beneficiary card so she must have Inuit ancestry on one side of her family,” read the message. “People are not able to get a government issued card unless theyre able to provide the government with a great deal of information.”
The sleuths were now watching the twins every public move. In September 2022, Nadya travelled to Norway to play soccer. On her social media, she posted a picture of a boarding pass and a British passport—presumably a connection to her father. That picture became more grist for the online rumour mill. Akoak re-posted the image on her Facebook, laughing at the idea that Nadya could be Inuit with a British passport. Online, more and more Indigenous people began asking questions about the twins identity. Inuit throat singer Tanya Tagaq asked which community, if any, could claim them.
---
##### Online sleuths began tweeting about the twins. “Nadya and Amira Gill are taking advantage of the white inability to tell brown folks apart,” read one post
---
 
As the scrutiny intensified, the girls online presence changed. Kanatas website, which had called the girls Inuit, was edited to read “Indigenous owned.” It was too late. In March of 2023, Akoak contacted the sisters via Instagram and asked which band the Gill sisters belonged to and whether they were truly Indigenous. Someone using the Kanata Instagram account—its unclear whether it was one of the sisters or their mother—responded that the twins were originally from Iqaluit but that the details were “a long story.” They ended with a plea: “I hope you can respect our personal lives and also know that we dont keep a cent for any personal gain.” Later, in July, APTN journalist Danielle Paradis confirmed that Kanata had made a donation of at least $5,000 to Indspire, although the sisters and their mother have kept quiet about how much total revenue the business earned.
By then, the twins were in their 20s and would have had many opportunities to question their own purported ties to Inuit culture. If their mother led them to believe they held legal status in the North, werent they curious about the specifics? And if they were benefiting so richly, wasnt it incumbent upon them to understand exactly why? The two young women had travelled in enough Indigenous circles to be familiar with the harm caused by false claims of Indigeneity. Publicly, they offered vague answers, likely hoping it would all blow over—a lot was riding on their appropriated identities.
In addition to running Kanata, Nadya was articling at Durant Barristers. The firm has offices in Toronto, among other cities, and its practice areas include Indigenous and sports law. Nadyas apparent Inuit status was nowhere to be found on her public company bio. Amira was working as a technical specialist at Defence Construction Canada, a Crown corporation that delivers security-linked infrastructure projects. Just as they had finally arrived—young professionals with impressive early careers—everything theyd accomplished was at risk of falling apart. The lie had metastasized, drawing in doubters, threatening to ruin them.
In late March of 2023, the online investigation reached one of Kitty Noahs actual daughters, who called her brother Noah Noah and told him that people were talking about their mom on Facebook. His heart sank as he read through a series of posts about twin girls hed never heard of but who claimed they were his mothers biological daughters. Later that day, a representative from NTI reached out to Noah and asked him if he knew the twins. He confirmed that he didnt, then asked who had filed the application. The NTI representative uttered a name he hadnt heard in more than two decades: Karima Manji. He and his siblings had been relieved when she finally left their lives. And now she was back. *Of course it was Karima*, he thought. Who else would have been so brazen?
On March 30, 2023, soon after NTI called Noah, it released a public statement announcing that it had become aware of potentially fraudulent enrolment involving Manji and her daughters. The organization acknowledged that it had—finally—spoken to Kitty Noah, the Inuit woman listed as the twins birth mother, and that she and her family had indicated that the two girls were not her children. Later that same day, a reporter named Jeff Pelletier broke the story in the *Nunatsiaq News*.
Pelletier reached out to Amira, who responded via email, the only time shes publicly addressed the accusations. She said that her and her sisters “Inuit family ties” were related to their mothers time in the North and that the sisters relationship with their parents was strained. Amira took pains to enumerate the good deeds the sisters had done. She boasted that she and Nadya were integral parts of the community in Kingston, where theyd gone to university, and that Kanata had begun as a temporary project to help Indspire but that the charity had asked them to continue their work after two months of success. She claimed that she and her sister had received their NTI enrolment cards “at a young age” and that they had “no knowledge of the enrolment process.” To her mind, they were victims, being “attacked online by extremist individuals.”
Her comments read like a desperate attempt to amplify the twins virtues while circumventing the truth. Shortly after Pelletiers article was published, Durant placed Nadya on leave, pending investigation, and Amira was fired from her job at Defence Construction Canada. Their older brother, Liam, who was by then working as a lawyer and start-up coach, began responding to comments on social media. He confirmed that he and his sisters shared the same biological parents and that his sisters were not adopted. He added that his family had many issues beyond those in the news and that he had moved away at his earliest opportunity as a result.
In early April, the Noah family released a statement in which they confirmed that they knew Karima Manji but stressed that they and Kitty had no knowledge of Amira or Nadya. “Our mother is a vulnerable person who may have been exploited,” it reads. “It is our priority at this time to protect her dignity and to support our family, as this has been an unexpected and stressful experience.” They called upon the RCMP and the various Indigenous organizations that had provided funding to the Gill twins to investigate. “Our family has not asked to be part of this conversation, but we have been brought into it. We are seeking truth, justice and accountability.”
---
##### The Gill sisters claimed that they had “no knowledge of the enrolment process.” To Amiras mind, they were victims, being “attacked by extremist individuals”
---
 
On April 13, NTI declared that it had removed Amira and Nadya from the Inuit enrolment list pending investigation. It described the situation as unprecedented and said that it had given the Gill sisters 30 days to respond to a set of questions. Indspire followed with a statement indicating that it was working closely with NTI to figure out the truth. Within a week of NTIs announcement, the RCMP announced that it would follow up on requests to investigate the twins.
Over the following days and weeks, the Gill sisters scrubbed their online presence. They took down both the Kanata site and Nadyas podcast and deleted their social media accounts. Manji, however, was apparently undeterred. In July, APTN journalist Danielle Paradis reported that a website called HOIF Trading Post had appeared online with a near-identical business model to Kanata. Its “About Us” page attributed the venture to “a group of friends in their senior years.” HOIF named only one of those friends: Ernest Ouimet—a man of Métis heritage who prefers to see himself as “more of an ally to Indigenous people.” Paradis, trying to ­confirm Ouimets identity and any connection to Kanata, discovered corporate records for HOIF listing both Amira Gill and Karima Manji as proprietors. And before it went offline, Kanata posted an announcement saying it was in the process of transferring the business to Ouimet.
The same month HOIF went live, Kitty Noah died in Nunavut from lung cancer. Noah Noah says she never fully grasped what was going on or the severity of the situation. But she did know that she hadnt given birth to the twins.
Finally, on September 14, the Iqaluit RCMP charged the twins and their mother with two counts each of fraud. Investigators alleged that the three women had received nearly $160,000 from the Kakivak Association and Qikiqtani Inuit Association, both of which are located in Iqaluit and provide grants and scholarships to Inuit. Neither the twins nor their mother have personally appeared at any of their court dates in Iqaluit, and as of late January, none of the allegations against them had been proven in court, nor had they entered pleas. When reached, Manjis lawyer, J. Scott Cowan, declined to comment on the case. Amiras lawyer, Alan Brass, did not respond to multiple requests for comment but previously told media that his client “maintains her innocence.” Nadya was representing herself.
After being fired from her engineering job, Amira is now working in the back room of a department store, doing inventory. The source I spoke to who is close to the family told me that the sisters were no longer speaking to their mother. “They definitely feel she did this to them,” the source said. Maybe Manji did tell her daughters that they were entitled to Inuit enrolment thanks to her connections to the North. Maybe they even believed her, despite her track record. But Amira and Nadya were smart, talented, ambitious and capable of understanding the implications of their claims to Inuit identity. And they still perpetuated and benefited from a narrative of overcoming adversity—even though that adversity never existed.
---
*This story originally appeared in the March 2024 issue of* Toronto Life *magazine. On February 8, after it went to press, Karima Manji pleaded guilty to fraud and, according to her lawyer, J. Scott Cowan, “took full responsibility for the matters at hand.” As a result, the Crown dropped all charges against Amira and Nadya Gill. An agreed statement of facts entered into the court confirmed that Manji gave birth to her twin daughters in Mississauga in September of 1998. She admitted to claiming that Kitty Noah was her daughters birth mother in order to fraudulently obtain their NTI enrolment cards. According to the statement of facts, Amira and Nadya were unaware the cards were fraudulent. Manji is scheduled to be sentenced in June. NTI has called the withdrawal of charges against the twins “unacceptable.” In a statement, the organizations president, Aluki Kotierk, said, “A familys privacy, peace, and dignity has been affected because of the actions of these three women. The two daughters benefitted from their mothers fraud scheme, and yet their role in the scheme will go unanswered.”*
*To subscribe to* Toronto Life *for just $39.99 a year, **[click here.](https://secure.torontolife.com/W2NASHPT)** To purchase single issues, **[click here.](https://canadianmags.ca/collections/toronto-life-single-issues)***
&emsp;
&emsp;
---
`$= dv.el('center', 'Source: ' + dv.current().Link + ', ' + dv.current().Date.toLocaleString("fr-FR"))`

@ -0,0 +1,104 @@
---
Alias: [""]
Tag: ["📟", "🪖"]
Date: 2024-03-04
DocType: "WebClipping"
Hierarchy:
TimeStamp: 2024-03-04
Link: https://harpers.org/archive/2024/03/the-pentagons-silicon-valley-problem-andrew-cockburn/
location:
CollapseMetaTable: true
---
Parent:: [[@News|News]]
Read:: [[2024-03-10]]
---
&emsp;
```button
name Save
type command
action Save current file
id Save
```
^button-ThePentagonsSiliconValleyProblemNSave
&emsp;
# The Pentagons Silicon Valley Problem, by Andrew Cockburn
Three months before Hamas attacked Israel, Ronen Bar, the director of Shin Bet, Israels internal security service, announced that his agency had developed its own generative artificial intelligence platform—similar to ChatGPT—and that the technology had been incorporated quite naturally into the agencys “interdiction machine,” assisting in decision-making “like a partner at the table, a co-pilot.” As the Israeli news site *Tech12* explained in a preview of his speech:
> The system knows everything about \[the terrorist\]: where he went, who his friends are, who his family is, what keeps him busy, what he said and what he published. Using artificial intelligence, the system analyzes behavior, predicts risks, raises alerts.
Nevertheless, Hamass devastating attack on October 7 caught Shin Bet and the rest of Israels multibillion-dollar defense system entirely by surprise. The intelligence disaster was even more striking considering Hamas carried out much of its preparations in plain sight, including practice assaults on mock-ups of the border fence and Israeli settlements—activities that were openly reported. Hamas-led militant groups even posted videos of their training online. Israelis living close to the border observed and publicized these exercises with mounting alarm, but were ignored in favor of intelligence bureaucracies analyses and, by extension, the software that had informed them. Israeli conscripts, mostly young women, monitoring developments through the ubiquitous surveillance cameras along the Gaza border, composed and presented a detailed report on Hamass preparations to breach the fence and take hostages, only to have their findings dismissed as “an imaginary scenario.” The Israeli intelligence apparatus had for more than a year been in possession of a Hamas document that detailed the groups plan for an attack.
Well aware of Israels intelligence methods, Hamas members fed their enemy the data that they wanted to hear, using informants they knew would report to the Israelis. They signaled that the ruling group inside Gaza was concentrating on improving the local economy by gaining access to the Israeli job market, and that Hamas had been deterred from action by Israels overwhelming military might. Such reports confirmed that Israels intelligence system had rigid assumptions of Hamas behavior, overlaid with a racial arrogance that considered Palestinians incapable of such a large-scale operation. AI, it turned out, knew everything about the terrorist except what he was thinking.
![Illustrations by Yoshi Sodeoka](https://harpers.org/wp-content/uploads/2024/01/CUT-8.jpg)
Such misplaced confidence was evidently not confined to Israeli intelligence. The November/December issue of *Foreign Affairs* not only carried a risibly ill-timed boast by national security adviser Jake Sullivan that “we have de-escalated crises in Gaza,” but also a paean to AI by Michèle Flournoy. Flournoy is a seasoned denizen of the military-industrial complex. The undersecretary of defense for policy under Barack Obama, she transitioned to, among other engagements, a lucrative founding leadership position with the defense consultancy WestExec Advisors. “Building bridges between Silicon Valley and the U.S. government is really, really important,” she told *The American Prospect* in 2020. Headlined ai is already at war, Flournoys *Foreign Affairs* article invoked the intelligence analysts who made “better judgments” thanks to AIs help in analyzing information. “In the future, Americans can expect AI to change how the United States and its adversaries fight on the battlefield,” she wrote. “In short, AI has sparked a security revolution—one that is just starting to unfold.” This wondrous new technology, she asserted, would enable America not only to detect enemy threats, but also to maintain complex weapons systems and help estimate the cost of strategic decisions. Only a tortuous and hidebound Pentagon bureaucracy was holding it back.
Lamenting obstructive Pentagon bureaucrats is a trope of tech pitches, one that plays well in the media. tech start-ups try to sell a cautious pentagon on a.i. ran a headline in the *New York Times* last November over a glowing report on Shield AI, a money-losing drone company for which Flournoy has been an adviser. Along with a review of the companys drone, the story cites:
> the many hurdles that the new generation of military contractors face as they compete for Pentagon funding against the far bigger and more entrenched weapons makers that have been supplying the military for decades.
But the notion that the Pentagon is resistant to new technologies is hardly fair—it reportedly funds at least 686 AI projects, including up to $9 billion for a Joint Warfighting Cloud Capability contract awarded in 2022 to a slew of major tech companies destined to, per one Pentagon official, “turbocharge” AI solutions. Another AI project, Gamechanger, is designed to enable Pentagon employees to discover what their giant department actually does, including where its money goes. A press release from the Joint Artificial Intelligence Center from early 2022 that celebrates Gamechangers inauguration noted “28 Authoriative \[*sic*\] Sources and quoted a senior Pentagon accountants excitement about “applying Gamechanger to gain better visibility and understanding across our various budget exhibits.” Even so, the Pentagon failed to pass a financial audit in 2023, for the sixth year in a row.
Artificial intelligence may indeed affect the way our military operates. But the notion that bright-eyed visionaries from the tech industry are revolutionizing our military machine promotes a myth that this relationship is not only new, but will fundamentally improve our defense system—one notorious for its insatiable appetite for money, poorly performing weapons, and lost wars. In reality, the change flows in the other direction, as new recruits enter the warm embrace of the imperishable military-industrial complex, eager to learn its ways.
The belief that software can solve problems of human conflict has a long history in U.S. war-making. Beginning in the late Sixties, the Air Force deployed a vast array of sensors across the jungles of Southeast Asia, masking the Ho Chi Minh trail along which North Vietnam supplied its forces in the south. Devised by scientists advising the Pentagon, the operation, code-named Igloo White, and designed to detect human activity by the sounds of marching feet, the smell of ammonia from urine, or the electronic sparks of engine ignitions, relayed information to giant IBM computers housed in a secret base in Thailand. The machines were the most powerful then in existence; they processed the signals to pinpoint enemy supply columns otherwise invisible under the jungle canopy. The scheme, in operation from 1967 to 1972 at a cost of at least hundreds of millions a year, was a total failure. The Vietnamese swiftly devised means to counter it; just as Hamas would short-circuit Shin Bet algorithms by feeding the system false information, the Vietnamese also faked data, with buckets of urine hung in trees off the trail, or herds of livestock steered down unused byways, which were then dutifully processed by the humming computers as enemy movements. Meanwhile, North Vietnamese forces in the south were well supplied. In 1972, they launched a powerful offensive using hundreds of tanks that went entirely undetected by Igloo White. The operation was abandoned shortly thereafter.
The IBM System 360 computers at the center of Igloo White were a prominent icon of the industry we now call Silicon Valley. Born of the electronics industry that helped secure victory in World War II, this sector flourished under Pentagon patronage during the Cold War. The development of integrated circuits, key to modern computers and first produced by Texas Instruments in 1958, was powered by an avalanche of defense dollars, and initially deployed in the guidance system for the Minuteman II intercontinental nuclear missile. Beginning with personal calculators, the microchip revolution eventually found a commercial market severed from the umbilical cord of government contracts, generating an industrial culture, eventually both physically and spiritually centered south of San Francisco—far removed from the Pentagon parent that had spawned it.
As Americas manufacturing economy gradually declined from the Eighties on, its Rust Belt heartland increasingly studded with decaying industrial cities, the digital economy grew at an exponential rate. Less than a month after its stock market debut in December 1980, Apple Computer was worth more than Ford. It was an industry happy to be independent of the irksome constraints of government contracting. Apples Macintosh personal computer, the young company imagined, would free citizens from the Orwellian world of government control “by giving individuals the kind of computer power once reserved for corporations.” But even though the original freewheeling iconoclasts of the tech industry saw themselves as “cowboys,” “rebels,” and “revolutionaries,” in the words of historian Margaret OMara, the divorce from defense was never absolute. The internet, hailed as a liberating technology, grew out of ARPANET, which had been developed by the Pentagons Advanced Research Projects Agency. According to Yasha Levine in *Surveil**lance Valley,* the proto-internet was deployed almost immediately to collect information on the antiwar movement. Google founders Larry Page and Sergey Brins early work at Stanford was funded in part by the same Pentagon agency, which by now had added “Defense” to its name to become DARPA. And Google Earth started as Keyhole EarthViewer, a mapping system partly funded by the CIAs venture capital offshoot In-Q-Tel, which was eventually acquired by Google.
Meanwhile, the Pentagon never lost sight of the unfulfilled dream of Igloo White: that computing power could make it possible to control the battlefield. Following the American retreat from Vietnam, vast sums were poured into Assault Breaker, in which powerful airborne radars would peer deep behind Soviet lines in Eastern Europe. It, too, abjectly failed its tests—the system could not distinguish tanks from cars, or from trees blowing in the wind—and the project was canceled the following decade. Yet military optimism was undimmed; senior commanders broadcast the notion of “netcentric warfare,” and their aspirations found fruit in such projects as the Future Combat Systems program, which linked sensors and weapons via high-powered processors to strike targets so effortlessly that, or so its proponents claimed, it would no longer be necessary to install defensive armor on tanks. But after consuming almost $20 billion of taxpayer dollars, it came to nothing. Same with the Department of Homeland Securitys Secure Border Initiative Network, marketed as a “virtual fence” equipped with computer-linked radar, cameras, and other surveillance sensors to detect intruders, which was canceled in 2011. Boeing had been a prime contractor on both of these baroque endeavors, a sclerotic contrast to the fast-paced dynamism of Silicon Valley. Surely the flourishing entrepreneurial culture of the West Coast could succeed where the old guard had failed.
Peter Thiel certainly thought so. A former securities lawyer, he had garnered his initial fortune as a co-founder of PayPal and grew vastly richer due to an early investment in Facebook. A professedly conservative libertarian contemptuous of “hippies who had “\[taken\] over the country,” he was determined, in the words of his biographer Max Chafkin, “to bring the military-industrial complex back to Silicon Valley, with his own companies at its very center.” Founded in 2003 and based on technology developed for fraud detection at PayPal, Thiels software company Palantir used data to detect and communicate patterns in simple visual displays. Despite proclaiming that “its essential to preserve fundamental principles of privacy and civil liberties while using data,” the CIA, via In-Q-Tel, was an early investor, and many of Palantirs initial contracts reportedly came from the intelligence community. As proof of its worth to such customers, it was claimed that Palantir had a major role in detecting not only the Chinese espionage network GhostNet in 2009, but the secret lair of Osama bin Laden in 2011. There is no evidence that these boasts were justified, but the claims entranced the media and attracted corporate customers. In the face of high-level military reluctance, Palantir marketed the wonders of its technology to mid-level Army officers and engaged cooperative lawmakers in Congress to lobby on its behalf.
Proponents of the Silicon Valley approach found friendly reception elsewhere in the upper tiers of the Pentagon—especially among acolytes of Andrew Marshall, the venerated former director of the Office of Net Assessment, an internal Pentagon think tank. One of them, embedded in Washingtons defense archipelago, was a former Marine named Robert O. Work. Appointed under Obama as undersecretary of the Navy in 2009 and rapidly promoted, Work was an ardent advocate of the notion that the United States was losing its technological lead, previously assured by its superiority in nuclear weapons, and then by its precision-guided weapons. Now the Chinese and Russians, he warned darkly, had caught up, endangering Americas military dominance. This threat, he believed, was rendered more urgent by caps on defense spending promised in the Budget Control Act of 2011. The danger could only be warded off by adopting, among other things, aerial and naval unmanned systems and AI-enabled battle networks. These were to be found in Silicon Valley.
In 2014, Secretary of Defense Chuck Hagel unveiled the Defense Innovation Initiative, overseen by Work, which, Hagel said, would “actively seek proposals ... from those firms and academic institutions outside DoDs traditional orbit.” Hagels successor, Ash Carter, made repeated pilgrimages to tech enclaves, shedding his tie and delivering boosterish homilies on the rewards of the collaboration. “Theyre inventing new technology, creating prosperity, connectivity, and freedom,” he told a reporter following an early visit. “They feel they too are public servants, and theyd like to have somebody in Washington they can connect to.” In 2015, Carter launched the Defense Innovation Unit Experimental (“Experimental” would later be dropped), with an office in Mountain View, near the headquarters of Google and Apple. The Department of Homeland Security had the same idea, setting up a satellite office nearby to “cultivate relationships with Silicon Valley technology companies, particularly non-traditional performers to help them understand DHSs challenges.” In 2016, Carter gave the budding relationship potent bureaucratic heft, convening a Defense Innovation Advisory Board populated with heavyweights from the tech and military worlds tasked with making recommendations directly to the secretary of defense. Heading the board was Eric Schmidt, former executive chairman and CEO of Google. Schmidts role soon grew larger, to head of the National Security Commission on Artificial Intelligence, with Work as his deputy. They were charged with advancing “the development of artificial intelligence, machine learning, and associated technologies to comprehensively address the national security and defense needs of the United States.”
Among the aims of Works AI initiative was a means to distill the vast amounts of information sucked up by satellites, phone intercepts, emails, and drones sitting in intelligence and military data banks into something accessible. In 2017, Google secured a contract for Project Maven, instituted by Work, aimed at accelerating “DoDs integration of big data and machine learning.” Project Mavens initial goal was to develop processing tools for the unceasing torrent of drone footage in order to identify targets. The contract, according to internal emails leaked to *Gizmodo*, specified that Googles involvement was not to be revealed without the companys permission. “Avoid at ALL COSTS any mention or implication of AI,” Fei-Fei Li, chief scientist for AI at Google Cloud, emailed colleagues. “Weaponized AI is probably one of the most sensitized topics of AI—if not THE most. This is red meat to the media to find all ways to damage Google.” She was right. When news broke of the contract, uproar ensued. “Dont be evil” had once been Googles motto, but by the time of Project Maven it had been replaced by a more herbivorous pledge to “Do the right thing.” Nevertheless, many of the companys more than eighty thousand workers were shocked that Google was involved in the militarys lethal drone assassination program. Around four thousand of them signed a petition demanding “a clear policy stating that neither Google nor its contractors will ever build warfare technology.” A handful resigned.
Amid the furor, no one appears to have noticed that Project Maven fit into the grand tradition of many other high-tech weapons projects: ecstatic claims of prowess coupled with a disregard for real-world experience. The “full motion video” to be processed through Googles technology was to be provided by Gorgon Stare, a system of pods arrayed with cameras mounted on Reaper drones. “We can see everything,” the *Washington Post* had announced breathlessly in a report on the systems alleged capabilities back when it was first unveiled. But, as the Air Force discovered, that was not true. A testing unit at Eglin Air Force Base revealed in a 2011 report that, among numerous other deficiencies, the cameras could not “readily find and identify targets,” and its transmission rate was too slow. The testers concluded that it was “not operationally effective” and should not be deployed in Afghanistan; the Air Force sent it anyway. “A lot of money has gone into it, and Im telling you right now the fielded stuff still cant do it,” a former fighter pilot and longtime Pentagon analyst familiar with the ongoing program informed me. After years of expensive effort, the “ATR \[automatic target recognition\] just doesnt work. Even driverless cars,” he emphasized “are relatively easy problems to solve compared to ATR.” Another combat veteran, now with a Pentagon agency working on these issues, told me that the AI developers he works with didnt seem to understand some of the requirements for the technologys military application. “I dont know if AI, or the sensors that feed it for that matter, will ever be capable of spontaneity or recognizing spontaneity,” he said. He cited a DARPA experiment in which a squad of Marines defeated an AI-governed robot that had been trained to detect them simply by altering their physical profiles. Two walked inside a large cardboard box. Others somersaulted. One wore the branches of a fir tree. All were able to approach over open ground and touch the robot without detection.
Despite the moral objections of Google employees, Project Maven did not die. Following the companys withdrawal, subcontracts were picked up by Microsoft, Amazon, and Palantir, among others. There was no public announcement, but the new deals were unearthed by a Google employee who had quit in revulsion. Jack Poulson, a former Stanford professor who specializes in advanced supercomputers, had left academic life in 2016 “to go where the actual experts were, which clearly was Google at the time,” as he put it to me. Once installed as a senior research scientist, he found that he disliked the corporate culture, despite the informality of the office, where some of his colleagues worked barefoot. It was their “sense of righteousness” that grated him. “Google culture was defined by an exceptionalism that they are the uniquely ethical company,” he told me, but he found they were prepared to “look the other way” when the company did “terrible things.” Poulsons final decision to quit was spurred by the information that, while eagerly pursuing Pentagon business, Google was simultaneously working with the Chinese government to build Dragonfly, a version of its search engine that would blacklist certain search terms, such as “human rights” and “student protest.”
The following year, Poulson was invited to a meeting at a well-known conservative think tank, alongside tech CEOs, high-ranking military officers, and intelligence officials. They were intrigued, he remembers, by what they regarded as Poulsons eccentric attitude toward defense work. One and all, they were eager to promote tech involvement in defense. “It was very shocking to me, the degree to which very senior U.S. military officials were desperate to work in the tech industry,” he recalls. “At one point, a high-ranking general was saying that one of the goals was to have at least a hundred flag officers in executive positions by the end of the next year.”
Conscious that few outside, or even inside, the business understood the extent of techs role in the military-industrial complex, Poulson, along with other dissidents, launched a website called Tech Inquiry. “There was so little coverage,” Poulson told me. “I started looking into some of these organizations and the contracts with the Defense Innovation Unit—it just seemed like such a zoo of companies.” Many of the details were obscure, buried in contracts accessible only through the relentless pursuit of Freedom of Information requests.
Googles retreat on the Maven contract sparked outrage in the burgeoning defense-tech complex. Thiel called Googles stance “treasonous,” while Schmidt said he “disagreed” with the decision. *The Atlantic* ran a story headlined the divide between silicon valley and washington is a national security threat. Amazon overlord Jeff Bezos, during a live event with *Wired,* huffed that “if big tech companies are going to turn their back on the U.S. Department of Defense, this country is going to be in trouble.”
Bezos had a personal interest in the issue. Amazon had accelerated techs intrusion into the defense complex back in 2013, winning a $600 million ten-year contract from the CIA for uses of the Amazon Web Services cloud originally built to host commercial-customer transactions. Cloud computing was becoming the new profit frontier for corporations such as Amazon, Microsoft, Oracle, and Google, which had sloughed off the moral qualms of the Maven episode to bid for a slice of the $9 billion Joint Warfighting Cloud Capability contract. Though they still reaped vast profits from commercial services, corporate eyes were turning to the government as a stable source of bountiful revenue. If indeed there ever had been a tech-Pentagon divide, it was disappearing fast.
Much has been made of the impact of drones on the war in Ukraine, the implications being that they represent a revolutionary advance in weapons technology. But arguably the most common and effective drones used by both sides have been simple, cheap devices whose parts are available to any consumer with an Amazon account, and jerry-rigged to carry small bombs or shells. They resemble the homemade IEDs deployed with deadly effect by insurgents in Iraq or Afghanistan more than high-tech DARPA products.
Nevertheless, the tech industry has been eager to show that it can do better. This past December, Anduril, another tech enterprise financially godfathered by Thiel to pursue the national security market, announced that it had developed Roadrunner, a small jet-powered drone purportedly capable of autonomous detection and destruction of jet-powered threats, including drones, before returning to its base, costing “in the low hundreds of thousands,” according to *Newsweek*. The announcement included a slick video of a Roadrunner flawlessly completing a test. As is customary, the media applauded “Americas latest game-changing weapon.” Veteran Pentagon analyst Franklin “Chuck” Spinney had a less starry-eyed reaction. “Marketing drivel,” he told me, expressing curiosity about how the drone was depicted landing tail-first in the desert with its exhausts hardly kicking up a plume of dust. (Anduril has not given any explanation for the apparent discrepancy.) Meanwhile, the Pentagon insider who alerted me to the cardboard box maneuver, and who has had the opportunity to review Andurils products, described them as “the F-35 of that world ... complicated to operate and too pricey.” Undeterred, the Special Operations Command awarded Anduril a billion-dollar contract for a counter-drone system in January 2022.
Anduril, named, like Palantir, in a whimsical reference to *The Lord of the Rings*, is the brainchild of Palmer Luckey. As a teenager, Luckey developed Oculus, a virtual-reality headset company that he sold to Facebook for $3 billion. He then focused on defense work, lamenting that people with the relevant tech skills to build the weapons of the future were “largely refusing to work with the defense sector.” After selling a border-surveillance system, Luckey turned his attention to drones and other weapons systems, all while harboring more ambitious visions for the future of warfare. Speaking to a sympathetic CNN interviewer in 2018, he revealed that Anduril was working on an “AI-powered sensor fusion platform” to “build a perfect 3D model of everything thats going on in a large area.” Soldiers in the future, he predicted confidently, would be “superheroes with “the power of perfect omniscience over their area of operations, where they know where every single enemy is, where every friend is, where every asset is.”
However fanciful the idea might seem, Army leadership was sufficiently seduced by the prospect of perfectly omniscient soldiers to award Microsoft a $21.9 billion deal in 2021 for an Integrated Visual Augmentation System (IVAS) based on the HoloLens headset. Unfortunately, a report from the Pentagons director of operational test and evaluation released in 2023 revealed that the majority of soldiers testing the system “reported at least one symptom of physical impairment to include disorientation, dizziness, eyestrain, headaches, motion sickness and nausea, neck strain and tunnel vision.” They also complained of the systems
> poor low-light performance, display quality, cumbersomeness, poor reliability, inability to distinguish friend from foe, difficulty shooting, physical impairments and limited peripheral vision.
Congress withheld most of the procurement funding, but the Army promptly handed Microsoft another $125 million to tweak the system, with the price tag climbing to just under $23 billion. (The Army claims that “soldier feedback was positive” in its in-house tests on the tweaked system.)
The rewards of IVAS, at an estimated $60,000 per soldier, are no doubt welcome to Microsoft, given that the market for the HoloLens has been faring badly, but the giant corporation has a far more glittering prize in sight since the ecstatic reaction to OpenAIs unveiling of ChatGPT. Not everyone has been impressed. Commenting on the alleged threat of super-intelligent machines, Metas chief AI scientist Yann LeCun suggested that such alarms were “very premature until we have a design for a system that can even rival a cat in terms of learning capabilities, which we dont have at the moment.” Nate Koppikar, who has made hundreds of millions of dollars betting against tech as co-founder of the investment firm Orso Partners, is another skeptic. “Whats been going on in tech since 2016 has just been, for lack of a better term, a bunch of bullshit,” he told me. He pointed out that the sector has been losing money and cutting staff following a bubble that finally burst in late 2021, losing industry investors roughly $7.4 trillion. “And then all of a sudden were sold this promise of AI as the next big thing.” He believes that the fears over evil AI robots “like Arnold Schwarzeneggers Terminator” are part of a marketing campaign to convince us of the awesome power of the technology which, as he pointed out, suffers from inherent defects, including a propensity to make things up, a seemingly intractable tendency known in the industry as “hallucinations.” He pointed to Palantir, which, he said, had been losing money prior to going public in late 2020. (The stock went from a high of $45 in January 2021 to just under $8 two years later.) “So theyve completely flipped the script,” he said. “This year they turned themselves into an AI company.”
I was curious about Palantir, whose stock indeed soared amid the 2023 AI frenzy. I had been told that the Israeli security sectors AI systems might rely on Palantirs technology. Furthermore, Shin Bets humiliating failure to predict the Hamas assault had not blunted the Israeli Defense Forces appetite for the technology; the unceasing rain of bombs upon densely packed Gaza neighborhoods, according to a well-sourced report by Israeli reporter Yuval Abraham in +*972 Magazine,* was in fact partly controlled by an AI target-creation platform called the Gospel. The Gospel produces automatic recommendations for where to strike based on what the technology identifies as being connected with Hamas, such as the private home of a suspected rank-and-file member of the organization. It also calculates how many civilians, including women and children, would die in the process—which, as of this writing, amounted to at least twenty-two thousand people, some 70 percent of them women and children. One of Abrahams intelligence sources termed the technology a “mass assassination factory.” Despite the high-tech gloss on the massacre, the result has been no different than the slaughter inflicted, with comparatively more primitive means, against Dresden and Tokyo during World War II.
To determine whether Palantir, which CEO Alex Karp has proudly proclaimed “stands with Israel,” was playing a role in the mass killing, I contacted the company, but received no response. So I turned to AI. I first asked OpenAIs ChatGPT, which told me that it had no information because its training had ended in January 2022. I then asked Googles AI platform, Bard, which confirmed that there was indeed such an arrangement. “In 2019, Palantir announced a new partnership with the IDF to develop AI-powered tools for the IDF,” it replied. “These tools are designed to help the IDF to identify and track potential threats, and to make better decisions about how to allocate resources.” When I asked for the original announcement, it sent me a professional-looking press release, complete with supportive quotes from Karp and the IDFs chief of staff—exactly the information I sought. But there was a problem: it was a hallucination. (It was mistaken about the IDF chief of staff.) No such press release had ever been issued.
&emsp;
&emsp;
---
`$= dv.el('center', 'Source: ' + dv.current().Link + ', ' + dv.current().Date.toLocaleString("fr-FR"))`

@ -102,7 +102,8 @@ image: https://cdn.sanity.io/images/pvn35iyy/production/38d2b681648b73c67173e22c
&emsp;
- [ ] :label: [[Bookmarks - Mac applications]]: review bookmarks %%done_del%% 🔁 every 3 months 📅 2024-03-09
- [ ] :label: [[Bookmarks - Mac applications]]: review bookmarks %%done_del%% 🔁 every 3 months 📅 2024-06-09
- [x] :label: [[Bookmarks - Mac applications]]: review bookmarks %%done_del%% 🔁 every 3 months 📅 2024-03-09 ✅ 2024-03-08
&emsp;
&emsp;

@ -114,7 +114,8 @@ hide task count
&emsp;
- [ ] :moneybag: [[@Finances]]: Transfer UK pension to CH %%done_del%% 🔁 every year 📅 2024-10-31
- [ ] :heavy_dollar_sign: [[@Finances|Finances]]: update crypto prices within Obsidian %%done_del%% 🔁 every month on the 2nd Tuesday 📅 2024-03-12
- [ ] :heavy_dollar_sign: [[@Finances|Finances]]: update crypto prices within Obsidian %%done_del%% 🔁 every month on the 2nd Tuesday 📅 2024-04-09
- [x] :heavy_dollar_sign: [[@Finances|Finances]]: update crypto prices within Obsidian %%done_del%% 🔁 every month on the 2nd Tuesday 📅 2024-03-12 ✅ 2024-03-08
- [x] :heavy_dollar_sign: [[@Finances|Finances]]: update crypto prices within Obsidian %%done_del%% 🔁 every month on the 2nd Tuesday 📅 2024-02-13 ✅ 2024-02-09
- [x] :heavy_dollar_sign: [[@Finances|Finances]]: update crypto prices within Obsidian %%done_del%% 🔁 every month on the 2nd Tuesday 📅 2024-01-09 ✅ 2024-01-06
- [ ] :heavy_dollar_sign: [[@Finances|Finances]]: Close yearly accounts %%done_del%% 🔁 every year 📅 2025-01-07

@ -83,7 +83,7 @@ style: number
#### Snacks & Sweets
- [x] 🍿 Snacks ✅ 2024-02-02
- [x] 🍿 Snacks ✅ 2024-03-03
- [x] 🍦 Dessert ✅ 2023-12-21
- [x] 🥠 Crackers (Tuc) ✅ 2024-01-08
- [x] 🍥 Tortilla chips ✅ 2023-11-05
@ -157,9 +157,9 @@ style: number
#### Bases
- [x] 🍝 Pasta ✅ 2023-12-23
- [x] 🍜 Noodles ✅ 2024-02-09
- [x] 🍜 Noodles ✅ 2024-03-08
- [x] 🌾 Bulgur ✅ 2022-10-29
- [x] 🍚 Rice ✅ 2023-11-10
- [x] 🍚 Rice ✅ 2024-03-08
- [x] 🥔 Potatoes ✅ 2024-01-13
- [x] 🥣 Soup ✅ 2023-06-12
@ -273,7 +273,7 @@ style: number
- [x] 🧻 Kitchen towel ✅ 2024-01-08
- [x] 🧽 Sponge ✅ 2023-01-18
- [x] 🧴 Dish soap ✅ 2023-10-16
- [x] 🍽️ Dishwasher tablets ✅ 2023-02-26
- [x] 🍽️ Dishwasher tablets ✅ 2024-03-03
- [x] 🧂Dishwasher salt ✅ 2023-01-18
- [x] 🚰 Dishwasher rinsing aid ✅ 2023-08-12
- [x] 🗑️ Züri Säcke ✅ 2023-01-18

@ -79,7 +79,8 @@ style: number
- [x] ♻ [[Household]]: *Paper* recycling collection %%done_del%% 🔁 every 2 weeks on Tuesday 📅 2024-01-30 ✅ 2024-01-29
- [x] ♻ [[Household]]: *Paper* recycling collection %%done_del%% 🔁 every 2 weeks on Tuesday 📅 2024-01-16 ✅ 2024-01-15
- [x] ♻ [[Household]]: *Paper* recycling collection %%done_del%% 🔁 every 2 weeks on Tuesday 📅 2024-01-02 ✅ 2024-01-01
- [ ] ♻ [[Household]]: *Cardboard* recycling collection %%done_del%% 🔁 every 2 weeks on Tuesday 📅 2024-03-05
- [ ] ♻ [[Household]]: *Cardboard* recycling collection %%done_del%% 🔁 every 2 weeks on Tuesday 📅 2024-03-19
- [x] ♻ [[Household]]: *Cardboard* recycling collection %%done_del%% 🔁 every 2 weeks on Tuesday 📅 2024-03-05 ✅ 2024-03-05
- [x] ♻ [[Household]]: *Cardboard* recycling collection %%done_del%% 🔁 every 2 weeks on Tuesday 📅 2024-02-20 ✅ 2024-02-19
- [x] ♻ [[Household]]: *Cardboard* recycling collection %%done_del%% 🔁 every 2 weeks on Tuesday 📅 2024-02-06 ✅ 2024-02-05
- [x] ♻ [[Household]]: *Cardboard* recycling collection %%done_del%% 🔁 every 2 weeks on Tuesday 📅 2024-01-23 ✅ 2024-01-22
@ -94,7 +95,8 @@ style: number
- [x] 🛎️ :house: [[Household]]: Pay rent %%done_del%% 🔁 every month on the last 📅 2024-02-29 ✅ 2024-02-26
- [x] 🛎️ :house: [[Household]]: Pay rent %%done_del%% 🔁 every month on the last 📅 2024-01-31 ✅ 2024-01-28
- [x] 🛎️ :house: [[Household]]: Pay rent %%done_del%% 🔁 every month on the last 📅 2023-12-31 ✅ 2023-12-25
- [ ] 🛎 🧻 REMINDER [[Household]]: check need for toilet paper %%done_del%% 🔁 every week 📅 2024-03-11
- [ ] 🛎 🧻 REMINDER [[Household]]: check need for toilet paper %%done_del%% 🔁 every week 📅 2024-03-18
- [x] 🛎 🧻 REMINDER [[Household]]: check need for toilet paper %%done_del%% 🔁 every week 📅 2024-03-11 ✅ 2024-03-08
- [x] 🛎 🧻 REMINDER [[Household]]: check need for toilet paper %%done_del%% 🔁 every week 📅 2024-03-04 ✅ 2024-02-29
- [x] 🛎 🧻 REMINDER [[Household]]: check need for toilet paper %%done_del%% 🔁 every week 📅 2024-02-26 ✅ 2024-02-26
- [x] 🛎 🧻 REMINDER [[Household]]: check need for toilet paper %%done_del%% 🔁 every week 📅 2024-02-19 ✅ 2024-02-19

@ -139,7 +139,8 @@ divWidth=100
- [x] :racehorse: [[@Sally|Sally]]: EHV-1 vaccination dose %%done_del%% 🔁 every year 📅 2024-01-31 ✅ 2024-01-31
- [ ] :racehorse: [[@Sally|Sally]]: Influenza vaccination dose %%done_del%% 🔁 every year 📅 2025-01-31
- [x] :racehorse: [[@Sally|Sally]]: Influenza vaccination dose %%done_del%% 🔁 every year 📅 2024-01-31 ✅ 2024-01-31
- [ ] :racehorse: [[@Sally|Sally]]: Pay for horseshoes (150 CHF) %%done_del%% 🔁 every month 📅 2024-03-10
- [ ] :racehorse: [[@Sally|Sally]]: Pay for horseshoes (150 CHF) %%done_del%% 🔁 every month 📅 2024-04-10
- [x] :racehorse: [[@Sally|Sally]]: Pay for horseshoes (150 CHF) %%done_del%% 🔁 every month 📅 2024-03-10 ✅ 2024-03-08
- [x] :racehorse: [[@Sally|Sally]]: Pay for horseshoes (150 CHF) %%done_del%% 🔁 every month 📅 2024-02-10 ✅ 2024-02-07
- [x] :racehorse: [[@Sally|Sally]]: Pay for horseshoes (150 CHF) %%done_del%% 🔁 every month 📅 2024-01-10 ✅ 2024-01-08
```timeline

@ -103,7 +103,8 @@ style: number
- [ ] :snowflake: :sports_medal:[[@@Paris|:test_grandes_armes_de_paris:]]: Check out the [6 Nations](https://billetterie.ffr.fr/fr) 🔁 every year 📅 2025-01-30
- [x] :snowflake: :sports_medal:[[@@Paris|:test_grandes_armes_de_paris:]]: Check out the [6 Nations](https://billetterie.ffr.fr/fr) 🔁 every year 📅 2024-01-30 ✅ 2024-01-29
- [ ] :sunny: :sports_medal:[[@@Paris|:test_grandes_armes_de_paris:]]: Check out [RG](https://www.rolandgarros.com/fr-fr/page/billetterie-roland-garros) 🔁 every year 📅 2024-03-10
- [ ] :sunny: :sports_medal:[[@@Paris|:test_grandes_armes_de_paris:]]: Check out [RG](https://www.rolandgarros.com/fr-fr/page/billetterie-roland-garros) 🔁 every year 📅 2025-03-10
- [x] :sunny: :sports_medal:[[@@Paris|:test_grandes_armes_de_paris:]]: Check out [RG](https://www.rolandgarros.com/fr-fr/page/billetterie-roland-garros) 🔁 every year 📅 2024-03-10 ✅ 2024-03-10
- [ ] :sunny: :racehorse: [[@@Paris|:test_grandes_armes_de_paris:]]: Check out the [Open de France](https://www.poloclubchantilly.com/) 🔁 every year 📅 2024-08-25
&emsp;

@ -12,14 +12,14 @@ Source:
Language: EN
Published: 2010-09-29
Link:
Read:
Read: 2024-03-06
Cover: http://books.google.com/books/content?id=iSrI-BQqFf0C&printsec=frontcover&img=1&zoom=1&edge=curl&source=gbs_api
CollapseMetaTable: true
---
Parent:: [[@Reading master|Reading list]]
ReadingState:: 🟧
ReadingState:: [[2024-03-06]]
---

@ -12,14 +12,14 @@ Source:
Language: FR
Published: 2022-09
Link: "https://www.babelio.com/livres/Carrere-Yoga/1238561"
Read:
Read: 2024-03-09
Cover: "https://nimblespirit.com/wp-content/uploads/2022/12/Yoga-dEmmanuel-Carrere-Emoi-et-moi.jpg"
CollapseMetaTable: true
---
Parent:: [[@Reading master|Reading list]]
ReadingState:: 🟥
ReadingState:: [[2024-03-09]]
---

@ -237,7 +237,8 @@ sudo bash /etc/addip4ban/addip4ban.sh
#### Ban List Tasks
- [ ] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix %%done_del%% 🔁 every week on Saturday 📅 2024-03-09
- [ ] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix %%done_del%% 🔁 every week on Saturday 📅 2024-03-16
- [x] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix %%done_del%% 🔁 every week on Saturday 📅 2024-03-09 ✅ 2024-03-08
- [x] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix %%done_del%% 🔁 every week on Saturday 📅 2024-03-02 ✅ 2024-03-01
- [x] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix %%done_del%% 🔁 every week on Saturday 📅 2024-02-24 ✅ 2024-02-23
- [x] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix %%done_del%% 🔁 every week on Saturday 📅 2024-02-17 ✅ 2024-02-17
@ -297,7 +298,8 @@ sudo bash /etc/addip4ban/addip4ban.sh
- [x] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix %%done_del%% 🔁 every week on Saturday 📅 2023-08-12 ✅ 2023-08-07
- [x] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix %%done_del%% 🔁 every week on Saturday 📅 2023-08-05 ✅ 2023-08-05
- [x] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]] Get IP addresses caught by Postfix %%done_del%% 🔁 every week on Saturday 📅 2023-07-29 ✅ 2023-08-04
- [ ] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]]: Update the Blocked IP list %%done_del%% 🔁 every month on Saturday 📅 2024-03-09
- [ ] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]]: Update the Blocked IP list %%done_del%% 🔁 every month on Saturday 📅 2024-03-16
- [x] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]]: Update the Blocked IP list %%done_del%% 🔁 every month on Saturday 📅 2024-03-09 ✅ 2024-03-08
- [x] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]]: Update the Blocked IP list %%done_del%% 🔁 every month on Saturday 📅 2024-03-02 ✅ 2024-03-01
- [x] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]]: Update the Blocked IP list %%done_del%% 🔁 every month on Saturday 📅 2024-02-24 ✅ 2024-02-23
- [x] 🖥 [[Selfhosting]], [[Configuring UFW|Firewall]]: Update the Blocked IP list %%done_del%% 🔁 every month on Saturday 📅 2024-02-17 ✅ 2024-02-17

@ -343,7 +343,8 @@ And `\q` to exit the db.
- [x] [[Selfhosting]], [[Server Alias|Email Alias]]: Upgrader & Health checks 🔁 every 4 months 📅 2022-07-31 ✅ 2022-08-02
- [x] [[Selfhosting]], [[Server Alias|Email Alias]]: Upgrader & Health checks 🔁 every 4 months 📅 2022-03-31 ✅ 2022-03-31
- [ ] :email: [[Server Alias]]: Backup server %%done_del%% 🔁 every 6 months on the 1st Tuesday 📅 2024-03-05
- [ ] :email: [[Server Alias]]: Backup server %%done_del%% 🔁 every 6 months on the 1st Tuesday 📅 2024-09-03
- [x] :email: [[Server Alias]]: Backup server %%done_del%% 🔁 every 6 months on the 1st Tuesday 📅 2024-03-05 ✅ 2024-03-05
- [x] :email: [[Server Alias]]: Backup server %%done_del%% 🔁 every 6 months on the 1st Tuesday 📅 2023-09-05 ✅ 2023-09-08
- [x] :email: [[Server Alias]]: Backup server %%done_del%% 🔁 every 6 months on the 1st Tuesday 📅 2023-03-07 ✅ 2023-03-07
- [x] :email: [[Server Alias]]: Backup server %%done_del%% 🔁 every 6 months on the 1st Tuesday 📅 2022-09-06 ✅ 2022-09-06

@ -277,7 +277,8 @@ rclone sync source:'datapath' dest:'datapath'
&emsp;
- [ ] :cloud: [[Server Cloud]]: Backup server %%done_del%% 🔁 every 6 months on the 1st Tuesday 📅 2024-03-05
- [ ] :cloud: [[Server Cloud]]: Backup server %%done_del%% 🔁 every 6 months on the 1st Tuesday 📅 2024-09-03
- [x] :cloud: [[Server Cloud]]: Backup server %%done_del%% 🔁 every 6 months on the 1st Tuesday 📅 2024-03-05 ✅ 2024-03-05
- [x] :cloud: [[Server Cloud]]: Backup server %%done_del%% 🔁 every 6 months on the 1st Tuesday 📅 2023-09-05 ✅ 2023-09-08
- [x] :cloud: [[Server Cloud]]: Backup server %%done_del%% 🔁 every 6 months on the 1st Tuesday 📅 2023-03-07 ✅ 2023-03-07
- [x] :cloud: [[Server Cloud]]: Backup server %%done_del%% 🔁 every 6 months on the 1st Tuesday 📅 2022-09-06 ✅ 2022-09-06

@ -808,3 +808,115 @@ alias i=income
2024/03/03 Peage
expenses:Travel:EUR €6.70
liability:CreditCard:CHF
2024/03/03 Coop
expenses:Food:CHF CHF26.95
liability:CreditCard:CHF
2024/03/04 Bakery
expenses:Food:CHF CHF9.40
liability:CreditCard:CHF
2024/03/04 Commode entree: Dinon
expenses:Furniture:EUR CHF297.60
liability:CreditCard:CHF
2024/03/04 Coop
expenses:Food:CHF CHF5.30
liability:CreditCard:CHF
2024/03/04 Coop
expenses:Food:CHF CHF17.95
liability:CreditCard:CHF
2024/03/05 SBB
expenses:Travel:CHF CHF4.60
liability:CreditCard:CHF
2024/03/05 Hotel Dijon
expenses:Travel:EUR CHF85.00
liability:CreditCard:CHF
2024/03/05 Migros
expenses:Food:CHF CHF18.20
liability:CreditCard:CHF
2024/03/06 Coffee
expenses:Food:CHF CHF39.00
liability:CreditCard:CHF
2024/03/06 Coop
expenses:Food:CHF CHF5.30
liability:CreditCard:CHF
2024/03/07 Coop
expenses:Food:CHF CHF9.45
liability:CreditCard:CHF
2024/03/08 Petrol
expenses:Travel:EUR €40.00
liability:CreditCard:CHF
2024/03/08 Bakery
expenses:Food:EUR €2.50
liability:CreditCard:CHF
2024/03/07 Hotel
expenses:Travel:EUR €11.76
liability:CreditCard:CHF
2024/03/07 Peage
expenses:Travel:EUR €16.10
liability:CreditCard:CHF
2024/03/07 Peage
expenses:Travel:EUR €3.10
liability:CreditCard:CHF
2024/03/07 Petrol
expenses:Travel:CHF CHF89.08
liability:CreditCard:CHF
2024/03/08 Coffee
expenses:Food:EUR €4.80
liability:CreditCard:CHF
2024/03/08 Peage
expenses:Travel:EUR €16.10
liability:CreditCard:CHF
2024/03/08 Peage
expenses:Travel:EUR €3.10
liability:CreditCard:CHF
2024/03/08 Ikea
expenses:Furniture:CHF CHF29.95
liability:CreditCard:CHF
2024/03/08 Migros
expenses:Food:CHF CHF45.45
liability:CreditCard:CHF
2024/03/08 Coop
expenses:Food:CHF CHF3.35
liability:CreditCard:CHF
2024/03/09 Ski pass: Flumserberg
expenses:Sport:CHF CHF77.00
liability:CreditCard:CHF
2024/03/09 Lunch Flumserberg
expenses:Food:CHF CHF21.40
liability:CreditCard:CHF
2024/03/09 Petrol
expenses:Travel:CHF CHF60.44
liability:CreditCard:CHF
2024/03/09 Stand for picture
expenses:Furniture:CHF CHF99.90
liability:CreditCard:CHF
2024/03/09 Crochets & corde
expenses:Furniture:CHF CHF4.75
liability:CreditCard:CHF

@ -70,7 +70,8 @@ All tasks and to-dos Crypto-related.
&emsp;
%%- [ ] 💰[[Crypto Tasks#internet alerts|monitor Crypto news and publications]] %%done_del%% 🔁 every week on Friday 📅 2022-12-16%%
- [ ] :ballot_box_with_ballot: [[Crypto Tasks]]: Vote for [[EOS]] block producers %%done_del%% 🔁 every month on the 1st Tuesday 📅 2024-03-05
- [ ] :ballot_box_with_ballot: [[Crypto Tasks]]: Vote for [[EOS]] block producers %%done_del%% 🔁 every month on the 1st Tuesday 📅 2024-04-02
- [x] :ballot_box_with_ballot: [[Crypto Tasks]]: Vote for [[EOS]] block producers %%done_del%% 🔁 every month on the 1st Tuesday 📅 2024-03-05 ✅ 2024-03-05
- [x] :ballot_box_with_ballot: [[Crypto Tasks]]: Vote for [[EOS]] block producers %%done_del%% 🔁 every month on the 1st Tuesday 📅 2024-02-06 ✅ 2024-02-06
- [x] :ballot_box_with_ballot: [[Crypto Tasks]]: Vote for [[EOS]] block producers %%done_del%% 🔁 every month on the 1st Tuesday 📅 2024-01-02 ✅ 2024-01-01
- [x] :ballot_box: [[Crypto Tasks]]: Vote for [[EOS]] block producers %%done_del%% 🔁 every month on the 1st Tuesday 📅 2023-12-05 ✅ 2023-12-05

Loading…
Cancel
Save