Skip to content

Instantly share code, notes, and snippets.

View dsebastien's full-sized avatar

Sebastien Dubois dsebastien

View GitHub Profile
@dsebastien
dsebastien / TPL Goal.md
Created July 21, 2026 06:59
Goal Templater template

<%"---"%> date_added: <% tp.date.now("YYYY-MM-DD") %> date_committed: <% tp.date.now("YYYY-MM-DD") %> date_completed: date_abandoned: status: <% await tp.system.suggester(["Idea", "Planned", "Active", "Back Burner", "On Hold", "Completed", "Abandoned"], ["99 - Idea", "20 - Planned", "30 - Active", "40 - Back Burner", "50 - On Hold", "60 - Completed", "70 - Abandoned"], false, "Choose a status") %> time_horizon: <% await tp.system.suggester(["TBD", "Within 6 Months", "Within 1 Year", "Within 3 Years", "Within 10 Years", "Someday"], ["99 - TBD", "10 - Within 6 Months", "20 - Within 1 Year", "30 - Within 3 Years", "40 - Within 10 Years", "50 - Someday"], false, "Choose a time horizon") %> necessity: <% await tp.system.suggester(["Skip", "TBD", "MUST", "SHOULD", "COULD", "WONT"], ["", "99 - TBD", "10 - MUST", "20 - SHOULD", "30 - COULD", "40 - WONT"], false, "Choose necessity level (optional)") %> urgency: <% await tp.system.suggester(["Skip", "TBD", "Now", "Soon", "This Year", "Next Year", "Future"], ["", "99 -

@dsebastien
dsebastien / TPL Dispatcher.md
Created July 21, 2026 06:53
Dispatcher Templater template

<%* // Master Templater dispatcher — auto-detects note type via OSK plugin and // applies the matching type-specific template. // // Both paths converge on write_template_to_file(tplFile, file), the same // call the OSK plugin uses internally (main.js applyTemplaterTemplate). It // targets a specific file by reference, so it sidesteps two failure modes // of the prior implementation: // - tp.file.include racing with the included template's tp.file.move // (content can be written to the pre-move path and lost).

name grill-me
description Relentless Socratic interview that drills into any idea, plan, decision, problem, or question until full clarity is reached. Reads relevant vault context first, then systematically walks every branch of the design/decision tree — one dependency at a time — surfacing assumptions, contradictions, and blind spots. Offers to capture outcomes as notes when done. Use when the user says "grill me on X", "drill into X", "interview me about X", "help me think through X", "interrogate my idea X", or "grill me".
argument-hint
idea
plan
decision
problem
or note path to grill
allowed-tools Read, Glob, Grep, Bash(obsidian *:*), mcp__qmd__vsearch, mcp__qmd__query, mcp__qmd__get, Bash(grep *), Write, Edit

Grill Me

Relentless Socratic interviewer. Drills into any starting point until full clarity is reached — no hand-waving, no vague answers, no unresolved dependencies.

#!/usr/bin/env node
const fs = require('fs');
const path = require('path');
// Configuration
const OUTPUT_DIR = '...'; // Relative path to the folder where landmark notes should be created
const FILE_PREFIX = 'Foo'; // Prefix for the landmark notes filenames
/**
<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with BasicAirData GPS Logger for Android - ver. 3.2.3 -->
<!-- Track 2 = 5097 TrackPoints + 4 Placemarks -->
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<name>GPS Logger 20251104-164542</name>
<description><![CDATA[5097 Trackpoints + 4 Placemarks]]></description>
<Style id="TrackStyle">
<LineStyle>
<color>ff0000ff</color>
use crate::audio_feedback::{play_feedback_sound, SoundType};
use crate::managers::audio::AudioRecordingManager;
use crate::managers::transcription::TranscriptionManager;
use crate::overlay::{show_recording_overlay, show_transcribing_overlay};
use crate::settings::get_settings;
use crate::time_utils::format_timestamp;
use crate::tray::{change_tray_icon, TrayIconState};
use crate::utils;
use crate::ManagedToggleState;
use log::debug;
@dsebastien
dsebastien / Dots.md
Last active September 10, 2025 10:19
OSK v3 Dots System (WIP)

New "Dot" Note Type

I've been a long fan of having everything centralized in my knowledge base. And now my vision of this is getting crystal clear:

Literature notes are for inputs: inspiration, with different stages:

  • You curate information (mindfully choose what to consume, then you prioritize & consume based on goals/projects/tasks/curiosity) (curated note type)
  • You capture highlights (highlights note type)
  • You take notes (literature note note type)

Permanent notes are for outputs: your own ideas, creations, outputs, creations, with different stages:

  • You capture ideas, thoughts, insights, (atomic) notes, ...
@dsebastien
dsebastien / tree.md
Last active August 27, 2025 14:36
OSK v3 Folder Structure
│ │ obsidian-starter-kit/                                                                                            │ │
│ │ ├── 10 Meta                                                                                                      │ │
│ │ │   ├── 11 Personal                                                                                              │ │
│ │ │   ├── 12 Routines                                                                                              │ │
│ │ │   ├── 13 Processes                                                                                             │ │
│ │ │   └── 14 Maintenance                                                                                           │ │
│ │ ├── 20 Actions                                                                                                   │ │
│ │ │   ├── 21 Goals                                                                                                 │ │
│ │ │   ├── 22 Plans                                
@dsebastien
dsebastien / ObsidianBaseFormulaAgeCalculation
Last active August 13, 2025 09:39
Obsidian Base Formula that calculate people's age (current, at death, died x years ago, ...)
if(date_of_birth && !date_of_birth.isEmpty(), if(date_of_death && !date_of_death.isEmpty(),"Died at "+ (if(/\d{4}-\d{2}-\d{2}/.matches(date_of_death.toString()), date(date_of_death),date(date_of_death.toString() + "-01-01")) - if(/\d{4}-\d{2}-\d{2}/.matches(date_of_birth.toString()), date(date_of_birth), date(date_of_birth.toString() + "-01-01"))).years.round() + " (" + (date(now()) - if(/\d{4}-\d{2}-\d{2}/.matches(date_of_death.toString()), date(date_of_death), date(date_of_death.toString() + "-01-01"))).years.round() + " years ago)", (date(now()) - if(/\d{4}-\d{2}-\d{2}/.matches(date_of_birth.toString()), date(date_of_birth), date(date_of_birth.toString() + "-01-01"))).years.round()), "")
@dsebastien
dsebastien / dumpCanvases.js
Created August 12, 2025 13:13
Oneliner that you can paste in the browser's console to find and dump/download all currently loaded Canvas elements
document.querySelectorAll('canvas').forEach((c,i)=>{try{const d=c.toDataURL();console.log(`Canvas ${i+1}: ${c.id||'no-id'} (${c.width}x${c.height})`,d);const a=document.createElement('a');a.download=`canvas_${i+1}_${c.id||'unnamed'}.png`;a.href=d;a.click();}catch(e){console.log(`Canvas ${i+1} error:`,e.message);}});