Premières entrées de journal en français : la semaine du 3 au 9 novembre

| french

Je pratique le français en écrivant dans un journal avec l'aide de l'IA Gemini et de ma tutrice Claire. Elle a corrigé mon travail ci-dessous. Il y avait quelques points à résoudre. Ces choses sont probablement trop mineures pour m'empêcher d'essayer ! =) Ensuite, je fais des cartes Anki pour étudier le vocabulaire et la grammaire. Je veux pratiquer l'oral en disant quelques mots aussi. (Petit à petit…) Voici les entrées de mon journal pour la semaine dernière.

Lundi le trois novembre

Text and links from sketch

lundi le trois novembre 2025-11-03-03

J'ai parlé le français avec Claire, qui est une tutrice. Ma fille apprend le français à l'école, alors j'aimerais aussi l'apprendre.

J'ai discuté avec Claire à propos de ma famille, de mes passe-temps, d'où je viens et depuis quand je suis venue au Canada.

Ensuite, j'ai emmené ma fille à son cours de gymnastique.

Si j'apprends le français, nous pouvons nous amuser ensemble.

  • Je veux améliorer ma prononciation.
  • Je veux lire des livres pour les enfants et l'information sur les produits. Il y a beaucoup de matériaux en français parce que j'habite au Canada.
  • Je veux écrire des entrées de journal.
  • Je veux parler avec ma famille en français.
  • "Il y a beaucoup de matériaux en français": matériaux ou matériel?
    • "Dans le domaine des sciences humaines et sociales (ethnologie, sociologie) ou en psychanalyse, on emploie le terme matériel pour désigner l’ensemble des éléments qui seront traités ou analysés. Matériau (ou son pluriel matériaux, si l’on veut insister sur la multiplicité ou la diversité des sources) désigne un ensemble de données, d’informations qui fournit la matière de base à un texte, un ouvrage, une recherche." (origine)
    • Pour example: Soutien linguistique - Simon Fraser University : “La bibliothèque Bennett de SFU dispose d'une grande sélection de matériaux en français et d'une bibliothécaire spécialisée pour t'aider à trouver des ressources, ainsi que du Student Learning Commons qui propose divers ateliers.”
    • Pour example: Matérial en français - tracpac.ab.ca
  • “lundi le trois novembre” ou “lundi trois novembre” ou “le lundi trois novembre” pour les entrées de journal
    • décision: je vaise laisser ça pour le moment: lundi le trois novembre
    • lundi le trois novembre Reddit (but note the comment on German influence?)
    • lundi trois novembre: Reddit
    • le lundi trois novembre Dates, Days & Months in French

Mardi le quatre novembre

Text from sketch

Mardi le quatre novembre 2025-11-04-08

Après l'école, j'ai emmené ma fille à son cours d'art. C'était son premier cours avec son amie. C'est proche, seulement dix minutes à vélo. Ensuite, j'ai fait du vélo près de la rivière. Il y avait quelques pêcheurs.

Le soleil se couchait, alors je suis rentrée chez moi et j'ai écrit cette entrée de journal intime.

Mon mari a cuisiné du riz frit pour le souper. J'ai changé la langue de Google Assistant sur mon mobile en français, et j'ai fait quelques cartes d'Anki. ("Règlez une minuterie de cinq minutes.")

Ma fille a dit qu'elle s'est amusée dans sa classe d'art.

Mercredi le cinq novembre

Text from sketch

mercredi le cinq novembre 2025-11-05-03

J’ai emmené ma fille chez la dentiste pour nos nettoyages. J’ai aussi fait des radiographies. Ça coûte chère, mais c’est nécessaire. Heureusement, nous n’avons pas de caries.

Normalement, après l’école le mercredi, nous jouons avec des amies de ma fille. Aujourd’hui nous sommes restés chez nous parce qu’il devait pleuvoir. Il n’a pas plu, mais il y avait du vent.

Pour le souper, mon mari a cuisiné des spaghettis au pesto de tomate.

Ensuite, j’ai chanté avec ma fille et j’ai écrit cette entrée.

Je vais faire une prise de sang demain. J’emmènerai peut-être ma fille pour jouer avec ses amies après l’école.

Jeudi le six novembre

Text and links from sketch

jeudi le six novembre 2025-11-06-03

J'ai préparé le déjeuner pour ma fille : des bleuets, des fraises, du fromage, des craquelins, des carottes, du riz, et du pâté de porc.

J'ai fait une prise de sang. J'ai attendu trente minutes, mais ce n'était pas grave parce que j'ai écouté quelques podcasts.

Ensuite, je suis retournée chez moi et j'ai pratiqué la compréhension orale et l'expression orale. J'aime le cours de FSI sur la phonologie française. Il y avait beaucoup de petites étapes.

La météo a annoncé de la neige pour dimanche, donc j'ai enlevé les pots de fleurs.

Mon mari a cuisiné du riz frit. Nous avons comparé les pommes. Nous préférons les pommes Gala qu'il a acheté au marché aux pommes Honeycrisp qu'il a acheté au supermarché.

Ma fille n'a pas voulu sortir, donc nous sommes restés chez nous. Elle a joué à Minecraft avec sa tante qui habite en Californie.

  • Nous préférons les pommes Gala qu'il a acheté au marché aux pommes Honeycrisp (ou achetées)
    • achetées: L’accord du participe passé avec avoir - Visez juste Le participe passé employé avec avoir s’accorde avec le complément d’objet direct (COD) s’il est placé avant le verbe. Pour trouvez le COD, vous devez prendre le sujet, le verbe et ensuite poser la question « qui » ou « quoi ». Dans la phrase, les fleurs que Patrick m’a envoyées étaient vraiment jolies. Ici, on dira donc Patrick a envoyé quoi? que placé avant le verbe et mis pour fleurs, féminin pluriel. Envoyé s’écrira donc envoyées.
    • Pour example: Quelques règles de syntaxe et d’orthographe pour votre mémoire 2025 « les fleurs que j'ai achetées sont magnifiques ». Ici, « achetées » s'accorde avec « fleurs », le COD, qui est au féminin pluriel.
    • De même, “que ma fille avait construit” ou “… construite”

Vendredi le sept novembre

Text from sketch

vendredi le sept novembre 2025-11-07-07

J'ai préparé le déjeuner pour ma fille : une orange, des bleuets, des craquelins, des carottes, du fromage, et un sandwich au jambon.

Pendant que ma fille était en classe virtuelle, j'ai étudié le troisième chapitre de mon cours de FSI sur la phonologie française.

C'était sur le phonème "u" et le phonème "r". C'était très difficile.

Après l'école, j'ai emmené ma fille à KidSpark. Nous n'y avons joué qu'une heure, mais j'ai utilisé un coupon pour mon entrée, donc ce n'était pas grave.

Mon mari est allé à la pharmacie pour les vaccins. Puis, il a cuisiné une courge au beurre et à la cassonade. Nous avons aussi mangé des restes.

Ensuite, nous avons joué à Space Escape, qui est un jeu de société.

Samedi le huit novembre

Text from sketch

samedi le huit novembre 2025-11-08-02

Aujourd'hui, ma fille a participé à un club de nature au parc. Je lui ai préparé un en-cas : une orange, un concombre, du fromage, un bonbon d'Halloween, et des craquelins.

Elle est trop grande pour ses pantalons de ski, donc nous sommes allés acheter des vêtements. Nous avons acheté de nouveaux pantalons de ski imperméables parce qu'en hiver, nous aimons patiner.

Pour le déjeuner, nous avons mangé de la crème de champignons et des pâtes.

Pendant que ma fille marchait au parc avec son club, mon mari et moi avons nettoyé les pots de fleurs.

Après l'avoir récupérée, nous avons bu du chocolat parce qu'elle avait un peu froid. Elle avait oublié ses gants.

Il va y avoir la première chute de neige demain !

Dimanche le neuf novembre

Text from sketch

dimanche le neuf novembre 2025-11-09-02

C'était la première chute de neige ! Pendant que la neige tombait nous nous sommes promenés. Ma fille avait trouvé que ses nouveaux pantalons de ski lui allaient bien. Ensuite, nous avons bu du chocolat chaud avec des guimauves.

Notre journée était tranquille. J'ai lu quelques livres. Mon mari et ma fille ont fait de l'exercice ensemble.

Pour le souper, j'ai cuisiné des sushis. Mon mari a aussi préparé de la salade de chou crue.

Ma fille a joué à Minecraft avec sa tante. Sa tante a fini la route de parkour que ma fille avait construite. C'est très difficile ! Je ne peux pas encore le finir.

J'ai pratiqué les phonèmes "r" et "eu". Je ne peux pas encore bien les prononcer. Je dois poser des questions à Claire demain. Ou je peux le laisser pour le moment.

Je suis un peu fatigué donc je vais me détendre.

View org source for this post

2025-11-10 Emacs news

| emacs, emacs-news

Links from reddit.com/r/emacs, r/orgmode, r/spacemacs, Mastodon #emacs, Bluesky #emacs, Hacker News, lobste.rs, programming.dev, lemmy.world, lemmy.ml, planet.emacslife.com, YouTube, the Emacs NEWS file, Emacs Calendar, and emacs-devel. Thanks to Andrés Ramírez for emacs-devel links. Do you have an Emacs-related link or announcement? Please e-mail me at sacha@sachachua.com. Thank you!

View org source for this post

Drawing lunch notes

| drawing

A+ goes to virtual school. She still wants me to pack a lunch for her every weekday, complete with a lunch note, so that she can "get the schoolkid experience." I started by drawing food and making food-related puns. Lately, she's been really into KPop Demon Hunters, so I've been drawing scenes from those:

scan0284.jpg
Figure 1: Art class this afternoon
scan0285.jpg
Figure 2: Ramyeon time, because she wanted ramen for lunch
scan0288.jpg
Figure 3: Adding A+ to the hoodie scene because it was getting cold
scan0289.jpg
Figure 4: Zoey with shrimp crackers, because I packed shrimp crackers for her lunch

Drawing from a reference image is good practice anyhow. Doing it on a lunch note means I get the payoff of giggles during her lunch break. Not bad.

Following up on Doodling icons in a grid, it's a lot easier to make confident lines when I'm just darkening something I've lightly sketched in. The resistance provided by the pencil going over the card stock helps, too.

Looking forward to more practice next week!

View org source for this post

Monthly review: October 2025

| monthly, review

Text from sketch

October 2025 2025-10-31-07

  1. Inktober
  2. Halloween costume
  3. taking it easy
  4. Minecraft w/ Titas
  5. apple delivery
  6. gymnastics class
  7. Minecraft club, griefers
  8. scramble for leaderboard
  9. Curriculum night
  10. KidSpark
  11. bike errands
  12. COVID vaccines
  13. Thanksgiving, family chat
  14. jukebox
  15. started corp. taxes
  16. Sketch Your Mind conf
  17. anxiety spike, but okay
  18. catching up with homework
  19. Zoo Boo
  20. blush
  21. s'mores
  22. drizzly day, doing our own things
  23. consultation
  24. library walk
  25. campfire day
  26. B-'s birthday party
  27. Just chillin'
  28. griefed
  29. coding, yay!
  30. ophthalmologist
  31. Halloween

October was tougher than usual, which really underscored how important health is. It was a lot to deal with, so we shuffled our priorities and lowered expectations. Things seem to have mostly settled down to a manageable new normal.

Fortunately, I was still able to focus on my client's time-sensitive event even when things were a little haywire. I'm glad I could solve their last-minute problem and work on some of their requests. Things are settling down now, but I'm probably not going to get much consulting done this month since I'm getting ready for EmacsConf in November. This is a pretty normal pattern now, so I know that putting off some requests for a while will be fine.

On the plus side, it was a good push to make a few changes. I started an exercise habit (13 days out of 31, 42%) following beginner workout videos on YouTube. I also made an effort to get out for a walk more often (20/31 days, 65%) to help with anxiety. I explored more of my thoughts and worries with journal entries, drawings, and the occasional blog post.

While I was pulling back and focusing on my hierarchy of needs, I wanted to make sure A+ also had resources for handling her big feelings. I set up Messenger Kids and Stars App on an old Android phone so that A+ could connect with her aunts and sisters without needing to go through me. We also subscribed to Minecraft Realms again so that they could play together. It's really nice overhearing them chat. It's important for A+ to have trusted people she can talk to, especially when she's grumpy with me.

We experimented with 1-on-1 gymnastics classes for A+. She's been asking about taking gymnastics for a while. I figured 1-on-1 can reduce the COVID risks. She can slow down the pace to be manageable even with a mask. Besides, she likes being able to talk with the teacher. She enjoys the classes. It's nice seeing her work hard and learn to tune into her body.

Piano-wise, I've been working on "In the Hall of the Mountain King." I can occasionally play the Simply Piano pre-advanced-level arrangement at full tempo with almost all the notes. My fingers still seize up from time to time, and I still forget to breathe. I'll get the hang of things someday.

I've been working on learning French. A+ is taking it in school, and languages are easier to learn if you can use it with people you like. I want to be able to use it with W- and A+. I also want to be able to take advantage of all the reading material around me.

A+'s current focus is KPop Demon Hunters. We've watched it several times, and we often sing the songs from the movie. Fortunately, she still had her heart set on dressing up as Elphaba for Halloween, so I didn't need to scramble a last-minute Rumi costume. I carved a pumpkin to look like Derpy the Tiger from KPop Demon Hunters. A+ proudly handed out candy and erasers to the early trick-or-treaters. When it got a bit darker, we put away the candy and I took her for a walk up and down the street. Then she handed out more candy. When she got cold and tired, I took over giving out candy. We ended up giving away almost 1,200 pieces.

So it was a pretty busy month.

Next month:

  • I'm experimenting with having a French tutor. I'd like to be able to speak and understand French, so a tutor can help with that. I've also been working on drawing and writing journal entries in French, and recording pronunciations.
  • We're experimenting with art classes for A+. One of her friends is taking it too. That way, she can have fun with art outside a school environment. Maybe that'll help sneak in some creative expression, fine motor skills, and frustration tolerance while she's having fun.
  • I want to continue backing off and letting A+ handle her schoolwork more independently. We'll be getting the first report card soon, so that'll give her some feedback on how things are going.
  • It's the last month before EmacsConf, so I need to get things ready. Looks like everyone's busy, so if it ends up being more of a casual hangout, that's totally okay too.
  • It's getting colder and A+'s friends are starting to move to more indoor playdates, so I think it'll be a little more challenging to spend time with them and to get the 2-3 hours that the ophthalmologist keeps emphasizing. Ah well.

Blog posts

Sketches

Time

Category Previous month % This month % Diff % h/wk Diff h/wk
Personal 11.6 14.2 2.6 24.7 4.4
Sleep 32.1 33.2 1.1 57.6 1.9
Unpaid work 5.1 5.9 0.9 10.3 1.5
A+ 29.2 30.1 0.9 52.2 1.4
Discretionary - Play 1.4 2.0 0.7 3.5 1.1
Discretionary - Family 0.2 0.3 0.2 0.6 0.3
Business 3.7 1.8 -1.9 3.2 -3.2
Discretionary - Productive 16.7 12.3 -4.4 21.4 -7.4
  • Exercise habit, yay!
  • Some untracked time just defaulting to the Personal - Routines category.
  • I spent less time consulting now that we've gotten past the scheduled event.
  • I slept an average of 8.2 hours a night, which is good. I know my brain has a hard time when I'm low on sleep, so I prioritize it when things are dicey.
  • I spent less time drawing, writing, and tinkering with Emacs, but maybe I'll get back to more of those things as life settles down.
2025-10-01 22:17 - 07:00: Sleep2025-10-01 22:06 - 22:17: Personal - Routines2025-10-01 20:19 - 22:06: A+ - Childcare2025-10-01 19:49 - 20:19: Personal - Routines2025-10-01 19:16 - 19:49: Discretionary - Productive - Drawing2025-10-01 19:10 - 19:16: Personal - Routines2025-10-01 18:53 - 19:10: Unpaid work - Clean the kitchen2025-10-01 18:27 - 18:53: Personal - Routines2025-10-01 18:00 - 18:27: Discretionary - Productive - Bike Brigade2025-10-01 15:15 - 18:00: A+ - Childcare2025-10-01 15:12 - 15:15: Personal - Routines2025-10-01 13:52 - 15:12: Business - Earn - Consulting - E1 - General2025-10-01 13:51 - 13:52: Discretionary - Productive - Drawing2025-10-01 13:38 - 13:51: Business - Earn - Consulting - E1 - General2025-10-01 12:37 - 13:38: Discretionary - Productive - Drawing2025-10-01 12:35 - 12:37: Business - Earn - Consulting - E1 - General2025-10-01 12:05 - 12:35: A+ - Childcare2025-10-01 11:41 - 12:05: Personal - Routines2025-10-01 09:55 - 11:41: Discretionary - Productive - Emacs2025-10-01 09:23 - 09:55: Discretionary - Productive - Writing2025-10-01 08:45 - 09:23: Discretionary - Productive - Music2025-10-01 07:15 - 08:45: A+ - Childcare2025-10-01 07:00 - 07:15: Personal - Routines2025-09-30 23:39 - 07:00: Sleep2025-10-02 22:41 - 07:19: Sleep2025-10-02 22:36 - 22:41: Personal - Routines2025-10-02 21:30 - 22:36: A+ - Childcare2025-10-02 19:13 - 21:30: Discretionary - Productive - Drawing2025-10-02 18:37 - 19:13: Personal - Routines2025-10-02 17:24 - 18:37: A+ - Childcare2025-10-02 17:01 - 17:24: Discretionary - Productive - Drawing2025-10-02 16:55 - 17:01: Personal - Routines2025-10-02 15:13 - 16:55: A+ - Childcare2025-10-02 15:05 - 15:13: Discretionary - Productive - Music2025-10-02 14:45 - 15:05: Discretionary - Productive - Emacs2025-10-02 14:35 - 14:45: Business - Build - Paperwork2025-10-02 14:25 - 14:35: Personal - Routines2025-10-02 12:52 - 14:25: Discretionary - Productive - Writing2025-10-02 12:25 - 12:52: Unpaid work - Clean the kitchen2025-10-02 11:36 - 12:25: Personal - Routines2025-10-02 10:41 - 11:36: Discretionary - Productive - Writing2025-10-02 10:33 - 10:41: Discretionary - Productive - Writing2025-10-02 10:33 - 10:33: Discretionary - Productive - Writing2025-10-02 09:11 - 10:33: Discretionary - Productive - Bike Brigade2025-10-02 08:55 - 09:11: Unpaid work - Clean the kitchen2025-10-02 08:52 - 08:55: Discretionary - Productive - Music2025-10-02 07:22 - 08:52: A+ - Childcare2025-10-02 07:00 - 07:22: Personal - Routines2025-10-01 22:17 - 07:00: Sleep2025-10-03 23:36 - 07:00: Sleep2025-10-03 23:33 - 23:36: Personal - Routines2025-10-03 23:03 - 23:33: A+ - Childcare2025-10-03 23:02 - 23:03: Personal - Routines2025-10-03 21:18 - 23:02: Discretionary - Play - Stardew Valley2025-10-03 21:05 - 21:18: Discretionary - Productive - Emacs2025-10-03 20:14 - 21:05: Unpaid work - Clean the kitchen2025-10-03 19:59 - 20:14: A+ - Childcare2025-10-03 16:50 - 19:59: Discretionary - Play - Stardew Valley2025-10-03 15:18 - 16:50: A+ - Childcare2025-10-03 13:00 - 15:18: Discretionary - Productive - Bike Brigade2025-10-03 12:19 - 13:00: Discretionary - Productive - Emacs2025-10-03 11:32 - 12:19: A+ - Childcare2025-10-03 10:26 - 11:32: Discretionary - Productive - Emacs2025-10-03 10:22 - 10:26: Personal - Routines2025-10-03 09:40 - 10:22: Discretionary - Productive - Music2025-10-03 09:39 - 09:40: Personal - Routines2025-10-03 08:54 - 09:39: Business - Earn - Consulting - E1 - General2025-10-03 07:24 - 08:54: A+ - Childcare2025-10-03 07:19 - 07:24: Personal - Routines2025-10-02 22:41 - 07:19: Sleep2025-10-04 22:54 - 07:15: Sleep2025-10-04 22:46 - 22:54: Personal - Routines2025-10-04 21:46 - 22:46: A+ - Childcare2025-10-04 20:45 - 21:46: Discretionary - Play - Stardew Valley2025-10-04 19:27 - 20:45: A+ - Childcare2025-10-04 19:14 - 19:27: Discretionary - Productive - Bike Brigade2025-10-04 18:35 - 19:14: Personal - Routines2025-10-04 18:22 - 18:35: Unpaid work - Clean the kitchen2025-10-04 17:39 - 18:22: A+ - Childcare2025-10-04 17:06 - 17:39: Unpaid work - Laundry2025-10-04 16:45 - 17:06: Unpaid work - Clean the kitchen2025-10-04 16:00 - 16:45: A+ - Childcare2025-10-04 14:00 - 16:00: Unpaid work - Errands2025-10-04 13:37 - 14:00: A+ - Childcare2025-10-04 13:07 - 13:37: Discretionary - Productive - Bike Brigade2025-10-04 12:39 - 13:07: Personal - Routines2025-10-04 08:30 - 12:39: A+ - Childcare2025-10-04 07:00 - 08:30: Personal - Routines2025-10-03 23:36 - 07:00: Sleep2025-10-05 22:54 - 07:00: Sleep2025-10-05 22:50 - 22:54: Personal - Routines2025-10-05 20:47 - 22:50: A+ - Childcare2025-10-05 20:27 - 20:47: Personal - Routines2025-10-05 20:10 - 20:27: A+ - Childcare2025-10-05 20:01 - 20:10: Unpaid work - Clean the kitchen2025-10-05 19:41 - 20:01: A+ - Childcare2025-10-05 19:33 - 19:41: Unpaid work - Clean the kitchen2025-10-05 16:50 - 19:33: A+ - Childcare2025-10-05 16:45 - 16:50: Personal - Routines2025-10-05 15:46 - 16:45: Discretionary - Productive - Gardening2025-10-05 09:48 - 15:46: A+ - Childcare2025-10-05 07:38 - 09:48: A+ - Childcare2025-10-05 07:15 - 07:38: Personal - Routines2025-10-04 22:54 - 07:15: Sleep2025-10-06 22:29 - 07:01: Sleep2025-10-06 22:20 - 22:29: Personal - Routines2025-10-06 20:32 - 22:20: A+ - Childcare2025-10-06 20:22 - 20:32: Unpaid work - Laundry2025-10-06 19:52 - 20:22: A+ - Childcare2025-10-06 19:33 - 19:52: Personal - Routines2025-10-06 18:33 - 19:33: A+ - Childcare2025-10-06 17:45 - 18:33: Unpaid work - Cook2025-10-06 16:32 - 17:45: A+ - Childcare2025-10-06 16:02 - 16:32: Discretionary - Productive - Drawing2025-10-06 15:16 - 16:02: A+ - Childcare2025-10-06 14:01 - 15:16: Discretionary - Productive - Writing2025-10-06 13:01 - 14:01: Discretionary - Productive - Music2025-10-06 12:30 - 13:01: Unpaid work - Cook2025-10-06 11:31 - 12:30: A+ - Childcare2025-10-06 10:25 - 11:31: Discretionary - Productive - Emacs2025-10-06 09:14 - 10:25: Discretionary - Productive - Emacs2025-10-06 07:15 - 09:14: A+ - Childcare2025-10-06 07:00 - 07:15: Personal - Routines2025-10-05 22:54 - 07:00: Sleep2025-10-07 23:15 - 07:00: Sleep2025-10-07 22:44 - 23:15: Personal - Routines2025-10-07 17:31 - 22:44: A+ - Childcare2025-10-07 15:36 - 17:31: Discretionary - Productive - Emacs2025-10-07 15:17 - 15:36: A+ - Childcare2025-10-07 12:57 - 15:17: Discretionary - Productive - Emacs2025-10-07 07:01 - 12:57: Personal - Routines2025-10-06 22:29 - 07:01: Sleep2025-10-08 23:35 - 07:01: Sleep2025-10-08 23:20 - 23:35: Sleep2025-10-08 19:56 - 23:20: A+ - Childcare2025-10-08 19:36 - 19:56: Personal - Routines2025-10-08 18:56 - 19:36: Unpaid work - Tidy up2025-10-08 16:15 - 18:56: A+ - Childcare2025-10-08 13:51 - 16:15: Business - Earn - Consulting - E1 - General2025-10-08 13:46 - 13:51: Discretionary - Productive - Emacs2025-10-08 13:38 - 13:46: Business - Earn - Consulting - E1 - General2025-10-08 13:03 - 13:38: Personal - Plan2025-10-08 13:03 - 13:03: Personal - Routines2025-10-08 12:58 - 13:03: Business - Earn - Consulting - E1 - General2025-10-08 12:47 - 12:58: Discretionary - Productive - Writing2025-10-08 12:38 - 12:47: A+ - Childcare2025-10-08 12:34 - 12:38: Discretionary - Productive - Writing2025-10-08 12:30 - 12:34: A+ - Childcare2025-10-08 11:58 - 12:30: Business - Earn - Consulting - E1 - General2025-10-08 11:57 - 11:58: A+ - Childcare2025-10-08 11:52 - 11:57: Business - Earn - Consulting - E1 - General2025-10-08 10:55 - 11:52: A+ - Childcare2025-10-08 09:40 - 10:55: Discretionary - Productive - Writing2025-10-08 09:33 - 09:40: Personal - Routines2025-10-08 09:13 - 09:33: Discretionary - Productive - Music2025-10-08 07:43 - 09:13: A+ - Childcare2025-10-08 07:00 - 07:43: Personal - Routines2025-10-07 23:15 - 07:00: Sleep2025-10-09 22:54 - 07:14: Sleep2025-10-09 22:42 - 22:54: Personal - Routines2025-10-09 21:14 - 22:42: A+ - Childcare2025-10-09 20:54 - 21:14: Personal - Routines2025-10-09 20:24 - 20:54: Discretionary - Play - Stardew Valley2025-10-09 19:48 - 20:24: A+ - Childcare2025-10-09 19:38 - 19:48: Unpaid work - Clean the kitchen2025-10-09 19:18 - 19:38: Personal - Routines2025-10-09 15:07 - 19:18: A+ - Childcare2025-10-09 15:02 - 15:07: Discretionary - Productive - Writing2025-10-09 13:20 - 15:02: Unpaid work - Errands2025-10-09 12:50 - 13:20: Personal - Routines2025-10-09 12:28 - 12:50: Unpaid work - Clean the kitchen2025-10-09 11:32 - 12:28: A+ - Childcare2025-10-09 10:41 - 11:32: Discretionary - Productive - Bike Brigade2025-10-09 09:39 - 10:41: Discretionary - Productive - Emacs2025-10-09 09:21 - 09:39: Personal - Exercise2025-10-09 09:17 - 09:21: Personal - Routines2025-10-09 09:01 - 09:17: Discretionary - Productive - Music2025-10-09 07:30 - 09:01: A+ - Childcare2025-10-09 07:01 - 07:30: Personal - Routines2025-10-08 23:35 - 07:01: Sleep2025-10-10 23:00 - 00:47: Discretionary - Play - Read - Fiction2025-10-10 22:50 - 23:00: Personal - Routines2025-10-10 20:21 - 22:50: A+ - Childcare2025-10-10 19:48 - 20:21: Personal - Routines2025-10-10 19:18 - 19:48: Personal - Routines2025-10-10 18:00 - 19:18: Unpaid work - Cook2025-10-10 11:26 - 18:00: A+ - Childcare2025-10-10 11:01 - 11:26: Discretionary - Productive - Music2025-10-10 07:59 - 11:01: A+ - Childcare2025-10-10 07:14 - 07:59: Personal - Routines2025-10-09 22:54 - 07:14: Sleep2025-10-11 23:21 - 00:06: Discretionary - Play - Read - Fiction2025-10-11 23:17 - 23:21: Personal - Routines2025-10-11 22:02 - 23:17: A+ - Childcare2025-10-11 21:47 - 22:02: Discretionary - Productive - Bike Brigade2025-10-11 19:13 - 21:47: Unpaid work - Clean the kitchen2025-10-11 17:56 - 19:13: Personal - Routines2025-10-11 17:28 - 17:56: Discretionary - Productive - Bike Brigade2025-10-11 17:12 - 17:28: Personal - Exercise2025-10-11 17:10 - 17:12: Unpaid work - Tidy up2025-10-11 13:57 - 17:10: Unpaid work - Errands2025-10-11 12:57 - 13:57: A+ - Childcare2025-10-11 12:26 - 12:57: Unpaid work - Tidy up2025-10-11 10:08 - 12:26: A+ - Childcare2025-10-11 09:48 - 10:08: Discretionary - Productive - Bike Brigade2025-10-11 09:47 - 09:48: Discretionary - Productive - Bike Brigade2025-10-11 08:54 - 09:47: A+ - Childcare2025-10-11 07:04 - 08:54: Personal - Routines2025-10-11 00:47 - 07:04: Sleep2025-10-10 23:00 - 00:47: Discretionary - Play - Read - Fiction2025-10-12 23:23 - 00:07: Discretionary - Play - Read - Fiction2025-10-12 23:18 - 23:23: Sleep2025-10-12 19:49 - 23:18: A+ - Childcare2025-10-12 19:07 - 19:49: Discretionary - Play - Stardew Valley2025-10-12 18:57 - 19:07: Unpaid work - Clean the kitchen2025-10-12 18:47 - 18:57: Personal - Routines2025-10-12 18:29 - 18:47: Discretionary - Play - Stardew Valley2025-10-12 18:19 - 18:29: Discretionary - Productive - Emacs2025-10-12 17:44 - 18:19: Personal - Routines2025-10-12 14:36 - 17:44: Sleep2025-10-12 08:45 - 14:36: A+ - Childcare2025-10-12 07:15 - 08:45: Sleep2025-10-12 07:00 - 07:15: Personal - Routines2025-10-12 00:06 - 07:00: Sleep2025-10-11 23:21 - 00:06: Discretionary - Play - Read - Fiction2025-10-13 23:48 - 07:00: Sleep2025-10-13 22:35 - 23:48: Discretionary - Productive - Drawing2025-10-13 22:35 - 22:35: Personal - Routines2025-10-13 22:25 - 22:35: Personal - Routines2025-10-13 21:11 - 22:25: A+ - Childcare2025-10-13 20:26 - 21:11: Discretionary - Play - Stardew Valley2025-10-13 19:55 - 20:26: Personal - Routines2025-10-13 19:25 - 19:55: Unpaid work - Clean the kitchen2025-10-13 17:03 - 19:25: Personal - Routines2025-10-13 16:18 - 17:03: Personal - Walk - Other2025-10-13 16:03 - 16:18: A+ - Childcare2025-10-13 14:53 - 16:03: Unpaid work - Cook2025-10-13 13:23 - 14:53: Discretionary - Family2025-10-13 12:51 - 13:23: Unpaid work - Clean the kitchen2025-10-13 12:21 - 12:51: Personal - Routines2025-10-13 12:06 - 12:21: Discretionary - Play - Stardew Valley2025-10-13 11:36 - 12:06: Discretionary - Productive - Emacs2025-10-13 11:34 - 11:36: Personal - Routines2025-10-13 11:14 - 11:34: Unpaid work - Tidy up2025-10-13 10:54 - 11:14: Discretionary - Productive - Emacs2025-10-13 10:14 - 10:54: Unpaid work - Cook2025-10-13 09:38 - 10:14: Discretionary - Productive - Emacs2025-10-13 09:36 - 09:38: Unpaid work - Cook2025-10-13 08:36 - 09:36: A+ - Childcare2025-10-13 00:07 - 08:36: Sleep2025-10-12 23:23 - 00:07: Discretionary - Play - Read - Fiction2025-10-14 23:01 - 07:03: Sleep2025-10-14 22:28 - 23:01: Personal - Routines2025-10-14 20:50 - 22:28: A+ - Childcare2025-10-14 19:37 - 20:50: Discretionary - Productive - Writing2025-10-14 19:11 - 19:37: Personal - Routines2025-10-14 19:03 - 19:11: Unpaid work - Clean the kitchen2025-10-14 18:43 - 19:03: Personal - Routines2025-10-14 18:34 - 18:43: Discretionary - Productive - Writing2025-10-14 18:28 - 18:34: Discretionary - Productive - Emacs2025-10-14 18:24 - 18:28: Personal - Routines2025-10-14 16:55 - 18:24: A+ - Childcare2025-10-14 14:57 - 16:55: Unpaid work - Cook2025-10-14 14:34 - 14:57: Personal - Routines2025-10-14 13:38 - 14:34: Business - Earn - Consulting - E1 - General2025-10-14 13:17 - 13:38: Discretionary - Productive - Music2025-10-14 12:53 - 13:17: Unpaid work - Cook2025-10-14 12:39 - 12:53: Personal - Routines2025-10-14 12:34 - 12:39: Personal - Routines2025-10-14 12:27 - 12:34: A+ - Childcare2025-10-14 12:22 - 12:27: Business - Earn - Consulting - E1 - General2025-10-14 11:45 - 12:22: Personal - Routines2025-10-14 11:32 - 11:45: Business - Earn - Consulting - E1 - General2025-10-14 11:31 - 11:32: A+ - Childcare2025-10-14 10:20 - 11:31: Business - Earn - Consulting - E1 - General2025-10-14 10:11 - 10:20: A+ - Childcare2025-10-14 08:56 - 10:11: Business - Earn - Consulting - E1 - General2025-10-14 07:56 - 08:56: A+ - Childcare2025-10-14 07:00 - 07:56: Personal - Routines2025-10-13 23:48 - 07:00: Sleep2025-10-15 23:00 - 00:06: Discretionary - Play - Read - Fiction2025-10-15 22:22 - 23:00: Discretionary - Productive - Drawing2025-10-15 22:20 - 22:22: Personal - Routines2025-10-15 21:11 - 22:20: A+ - Childcare2025-10-15 19:28 - 21:11: Discretionary - Productive - Writing2025-10-15 18:35 - 19:28: Personal - Routines2025-10-15 17:50 - 18:35: A+ - Childcare2025-10-15 13:57 - 17:50: Discretionary - Productive - Writing2025-10-15 13:42 - 13:57: Unpaid work - Clean the kitchen2025-10-15 13:04 - 13:42: Discretionary - Productive - Writing2025-10-15 12:36 - 13:04: Discretionary - Productive - Writing2025-10-15 12:25 - 12:36: Unpaid work - Clean the kitchen2025-10-15 11:35 - 12:25: Personal - Routines2025-10-15 10:01 - 11:35: Business - Build - Paperwork2025-10-15 09:44 - 10:01: Personal - Routines2025-10-15 09:36 - 09:44: Discretionary - Productive - Music2025-10-15 09:36 - 09:36: Discretionary - Productive - Sewing2025-10-15 09:30 - 09:36: Discretionary - Productive - Music2025-10-15 09:26 - 09:30: Personal - Routines2025-10-15 08:58 - 09:26: Personal - Exercise2025-10-15 07:58 - 08:58: A+ - Childcare2025-10-15 07:03 - 07:58: Personal - Routines2025-10-14 23:01 - 07:03: Sleep2025-10-16 23:25 - 00:25: Discretionary - Play - Read - Fiction2025-10-16 22:31 - 23:25: Discretionary - Productive - Drawing2025-10-16 22:01 - 22:31: A+ - Childcare2025-10-16 21:19 - 22:01: Discretionary - Productive - Drawing2025-10-16 19:09 - 21:19: A+ - Childcare2025-10-16 18:39 - 19:09: Personal - Routines2025-10-16 18:15 - 18:39: Unpaid work - Clean the kitchen2025-10-16 17:45 - 18:15: Personal - Routines2025-10-16 15:18 - 17:45: A+ - Childcare2025-10-16 15:17 - 15:18: Personal - Routines2025-10-16 12:29 - 15:17: Discretionary - Productive - Drawing2025-10-16 11:29 - 12:29: Personal - Routines2025-10-16 11:11 - 11:29: Discretionary - Productive - Writing2025-10-16 10:47 - 11:11: Business - Earn - Consulting - E1 - General2025-10-16 10:46 - 10:47: Personal - Routines2025-10-16 10:22 - 10:46: Business - Earn - Consulting - E1 - General2025-10-16 10:03 - 10:22: Discretionary - Productive - Music2025-10-16 09:37 - 10:03: Personal - Exercise2025-10-16 09:29 - 09:37: Personal - Routines2025-10-16 09:01 - 09:29: Discretionary - Productive - Bike Brigade2025-10-16 08:40 - 09:01: Discretionary - Productive - Emacs2025-10-16 07:00 - 08:40: Personal - Routines2025-10-16 00:42 - 07:00: Sleep2025-10-16 00:06 - 00:42: Discretionary - Family2025-10-15 23:00 - 00:06: Discretionary - Play - Read - Fiction2025-10-17 23:25 - 00:03: Discretionary - Play - Read - Fiction2025-10-17 23:24 - 23:25: Personal - Routines2025-10-17 22:55 - 23:24: A+ - Childcare2025-10-17 21:55 - 22:55: Discretionary - Productive - Drawing2025-10-17 18:37 - 21:55: A+ - Childcare2025-10-17 18:17 - 18:37: Personal - Routines2025-10-17 18:07 - 18:17: Unpaid work - Clean the kitchen2025-10-17 18:07 - 18:07: Personal - Routines2025-10-17 17:37 - 18:07: A+ - Childcare2025-10-17 16:53 - 17:37: Discretionary - Productive - Drawing2025-10-17 16:49 - 16:53: Personal - Routines2025-10-17 16:19 - 16:49: Discretionary - Productive - Music2025-10-17 15:31 - 16:19: Discretionary - Play - Stardew Valley2025-10-17 15:11 - 15:31: Personal - Plan2025-10-17 12:58 - 15:11: Personal - Plan2025-10-17 12:53 - 12:58: Personal - Routines2025-10-17 12:41 - 12:53: Personal - Plan2025-10-17 11:39 - 12:41: Personal - Routines2025-10-17 10:05 - 11:39: Unpaid work - Errands2025-10-17 07:20 - 10:05: Personal - Routines2025-10-17 00:30 - 07:20: Sleep2025-10-17 00:25 - 00:30: Discretionary - Productive - Nonfiction2025-10-17 00:25 - 00:25: Sleep2025-10-16 23:25 - 00:25: Discretionary - Play - Read - Fiction2025-10-18 23:57 - 00:03: Personal - Routines2025-10-18 20:16 - 23:57: A+ - Childcare2025-10-18 19:46 - 20:16: Personal - Routines2025-10-18 18:50 - 19:46: A+ - Childcare2025-10-18 18:45 - 18:50: Personal - Routines2025-10-18 18:32 - 18:45: Discretionary - Productive - Bike Brigade2025-10-18 18:17 - 18:32: Unpaid work - Clean the kitchen2025-10-18 16:55 - 18:17: Personal - Routines2025-10-18 15:55 - 16:55: Unpaid work - Cook2025-10-18 15:10 - 15:55: Unpaid work - Errands2025-10-18 12:47 - 15:10: A+ - Childcare2025-10-18 12:46 - 12:47: Personal - Routines2025-10-18 12:17 - 12:46: Discretionary - Productive - Music2025-10-18 12:07 - 12:17: Personal - Routines2025-10-18 11:27 - 12:07: Personal - Exercise2025-10-18 10:57 - 11:27: Unpaid work - Errands2025-10-18 08:37 - 10:57: A+ - Childcare2025-10-18 07:37 - 08:37: A+ - Childcare2025-10-18 07:01 - 07:37: Personal - Routines2025-10-18 00:03 - 07:01: Sleep2025-10-17 23:25 - 00:03: Discretionary - Play - Read - Fiction2025-10-19 23:02 - 07:00: Sleep2025-10-19 22:55 - 23:02: Personal - Routines2025-10-19 20:04 - 22:55: A+ - Childcare2025-10-19 19:34 - 20:04: Personal - Routines2025-10-19 19:01 - 19:34: Discretionary - Productive - Music2025-10-19 18:40 - 19:01: Unpaid work - Clean the kitchen2025-10-19 17:40 - 18:40: Personal - Routines2025-10-19 12:46 - 17:40: A+ - Childcare2025-10-19 12:41 - 12:46: Personal - Routines2025-10-19 11:12 - 12:41: A+ - Childcare2025-10-19 11:07 - 11:12: Personal - Routines2025-10-19 10:26 - 11:07: Personal - Walk - Other2025-10-19 08:12 - 10:26: Personal - Routines2025-10-19 07:15 - 08:12: Sleep2025-10-19 07:10 - 07:15: Personal - Routines2025-10-19 00:03 - 07:10: Sleep2025-10-18 23:57 - 00:03: Personal - Routines2025-10-20 23:36 - 00:06: Discretionary - Productive - Drawing2025-10-20 23:20 - 23:36: Personal - Routines2025-10-20 23:19 - 23:20: Sleep2025-10-20 22:41 - 23:19: Personal - Routines2025-10-20 20:10 - 22:41: A+ - Childcare2025-10-20 19:36 - 20:10: Personal - Routines2025-10-20 19:06 - 19:36: Unpaid work - Clean the kitchen2025-10-20 18:36 - 19:06: Personal - Routines2025-10-20 18:06 - 18:36: Unpaid work - Cook2025-10-20 15:19 - 18:06: A+ - Childcare2025-10-20 14:18 - 15:19: Discretionary - Productive - Emacs2025-10-20 13:41 - 14:18: Discretionary - Productive - Music2025-10-20 13:10 - 13:41: Personal - Exercise2025-10-20 12:26 - 13:10: Discretionary - Productive - Emacs2025-10-20 11:30 - 12:26: A+ - Childcare2025-10-20 11:00 - 11:30: Discretionary - Productive - Emacs2025-10-20 10:47 - 11:00: Discretionary - Productive - Emacs2025-10-20 09:05 - 10:47: Unpaid work - Errands2025-10-20 08:45 - 09:05: Personal - Routines2025-10-20 08:05 - 08:45: A+ - Childcare2025-10-20 07:00 - 08:05: Personal - Routines2025-10-20 07:00 - 07:00: Personal - Routines2025-10-19 23:02 - 07:00: Sleep2025-10-21 23:17 - 07:00: Sleep2025-10-21 23:07 - 23:17: Personal - Routines2025-10-21 21:06 - 23:07: A+ - Childcare2025-10-21 20:51 - 21:06: Discretionary - Productive - Drawing2025-10-21 20:23 - 20:51: Personal - Routines2025-10-21 19:23 - 20:23: Unpaid work - Clean the kitchen2025-10-21 18:33 - 19:23: Unpaid work - Cook2025-10-21 15:12 - 18:33: A+ - Childcare2025-10-21 15:07 - 15:12: Unpaid work - Laundry2025-10-21 14:37 - 15:07: Discretionary - Family2025-10-21 14:09 - 14:37: Unpaid work - Cook2025-10-21 12:49 - 14:09: Personal - Plan2025-10-21 12:42 - 12:49: Discretionary - Productive - Drawing2025-10-21 12:29 - 12:42: Unpaid work - Clean the kitchen2025-10-21 12:14 - 12:29: Personal - Routines2025-10-21 11:01 - 12:14: Discretionary - Productive - Drawing2025-10-21 10:31 - 11:01: A+ - Childcare2025-10-21 10:15 - 10:31: Personal - Exercise2025-10-21 10:10 - 10:15: A+ - Childcare2025-10-21 09:57 - 10:10: Personal - Exercise2025-10-21 08:55 - 09:57: Unpaid work - Errands2025-10-21 07:22 - 08:55: A+ - Childcare2025-10-21 06:48 - 07:22: Personal - Routines2025-10-21 00:06 - 06:48: Sleep2025-10-20 23:36 - 00:06: Discretionary - Productive - Drawing2025-10-22 23:22 - 07:09: Sleep2025-10-22 23:04 - 23:22: Personal - Routines2025-10-22 21:30 - 23:04: A+ - Childcare2025-10-22 20:02 - 21:30: Discretionary - Productive - Emacs2025-10-22 19:40 - 20:02: Discretionary - Productive - Writing2025-10-22 19:17 - 19:40: Personal - Routines2025-10-22 19:02 - 19:17: Unpaid work - Clean the kitchen2025-10-22 18:56 - 19:02: Personal - Routines2025-10-22 18:41 - 18:56: A+ - Childcare2025-10-22 18:05 - 18:41: Discretionary - Productive - Emacs2025-10-22 17:16 - 18:05: Discretionary - Productive - Writing2025-10-22 16:23 - 17:16: Discretionary - Productive - Writing2025-10-22 16:06 - 16:23: Personal - Routines2025-10-22 15:18 - 16:06: A+ - Childcare2025-10-22 14:02 - 15:18: Discretionary - Productive - Drawing2025-10-22 13:56 - 14:02: Personal - Routines2025-10-22 12:34 - 13:56: Business - Earn - Consulting - E1 - General2025-10-22 12:21 - 12:34: Personal - Routines2025-10-22 12:11 - 12:21: Unpaid work - Clean the kitchen2025-10-22 11:31 - 12:11: A+ - Childcare2025-10-22 11:24 - 11:31: Business - Earn - Consulting - E1 - General2025-10-22 10:54 - 11:24: Personal - Routines2025-10-22 10:52 - 10:54: Business - Earn - Consulting - E1 - General2025-10-22 10:52 - 10:52: Personal - Routines2025-10-22 10:50 - 10:52: A+ - Childcare2025-10-22 10:37 - 10:50: Discretionary - Productive - Music2025-10-22 10:07 - 10:37: Personal - Exercise2025-10-22 09:10 - 10:07: Personal - Walk - Other2025-10-22 07:30 - 09:10: A+ - Childcare2025-10-22 07:00 - 07:30: Personal - Routines2025-10-21 23:17 - 07:00: Sleep2025-10-23 23:11 - 00:04: Discretionary - Productive - Drawing2025-10-23 22:54 - 23:11: Personal - Routines2025-10-23 20:44 - 22:54: A+ - Childcare2025-10-23 20:29 - 20:44: Discretionary - Productive - Drawing2025-10-23 19:54 - 20:29: Personal - Routines2025-10-23 19:39 - 19:54: A+ - Childcare2025-10-23 19:38 - 19:39: Personal - Routines2025-10-23 19:23 - 19:38: A+ - Childcare2025-10-23 18:45 - 19:23: Unpaid work - Clean the kitchen2025-10-23 18:15 - 18:45: Personal - Routines2025-10-23 17:56 - 18:15: Unpaid work - Cook2025-10-23 17:49 - 17:56: Personal - Routines2025-10-23 15:10 - 17:49: A+ - Childcare2025-10-23 14:44 - 15:10: Personal - Plan2025-10-23 13:55 - 14:44: Unpaid work - Cook2025-10-23 13:44 - 13:55: Personal - Plan2025-10-23 13:34 - 13:44: Discretionary - Productive - Emacs2025-10-23 13:18 - 13:34: Discretionary - Productive - Bike Brigade2025-10-23 13:06 - 13:18: Discretionary - Productive - Writing2025-10-23 13:01 - 13:06: Discretionary - Productive - Bike Brigade2025-10-23 11:40 - 13:01: Personal - Routines2025-10-23 11:40 - 11:40: Personal - Routines2025-10-23 11:25 - 11:40: Personal - Routines2025-10-23 11:20 - 11:25: A+ - Childcare2025-10-23 10:54 - 11:20: Discretionary - Productive - French2025-10-23 10:21 - 10:54: Discretionary - Productive - Music2025-10-23 09:52 - 10:21: Personal - Exercise2025-10-23 09:50 - 09:52: Personal - Routines2025-10-23 09:04 - 09:50: Personal - Walk - Other2025-10-23 08:49 - 09:04: Personal - Routines2025-10-23 07:34 - 08:49: A+ - Childcare2025-10-23 07:09 - 07:34: Personal - Routines2025-10-22 23:22 - 07:09: Sleep2025-10-24 23:15 - 00:00: Discretionary - Productive - Nonfiction2025-10-24 23:12 - 23:15: Personal - Routines2025-10-24 19:33 - 23:12: A+ - Childcare2025-10-24 19:28 - 19:33: Discretionary - Productive - Drawing2025-10-24 18:45 - 19:28: Personal - Routines2025-10-24 18:29 - 18:45: Unpaid work - Clean the kitchen2025-10-24 18:02 - 18:29: Personal - Routines2025-10-24 15:21 - 18:02: A+ - Childcare2025-10-24 14:21 - 15:21: Personal - Routines2025-10-24 13:51 - 14:21: Sleep2025-10-24 13:31 - 13:51: Personal - Routines2025-10-24 12:40 - 13:31: Personal - Walk - Other2025-10-24 11:26 - 12:40: Personal - Routines2025-10-24 11:13 - 11:26: A+ - Childcare2025-10-24 11:07 - 11:13: Discretionary - Productive - Music2025-10-24 10:45 - 11:07: Discretionary - Productive - Music2025-10-24 09:51 - 10:45: Personal - Routines2025-10-24 09:21 - 09:51: Personal - Walk - Other2025-10-24 08:50 - 09:21: Personal - Routines2025-10-24 08:00 - 08:50: A+ - Childcare2025-10-24 00:34 - 08:00: Sleep2025-10-24 00:04 - 00:34: Personal - Plan2025-10-23 23:11 - 00:04: Discretionary - Productive - Drawing2025-10-25 23:15 - 07:52: Sleep2025-10-25 20:07 - 23:15: A+ - Childcare2025-10-25 19:37 - 20:07: Personal - Routines2025-10-25 19:28 - 19:37: Unpaid work - Clean the kitchen2025-10-25 18:45 - 19:28: Personal - Routines2025-10-25 18:11 - 18:45: Discretionary - Productive - Nonfiction2025-10-25 17:23 - 18:11: Discretionary - Productive - Writing2025-10-25 17:23 - 17:23: Business - Build - Paperwork2025-10-25 15:35 - 17:23: A+ - Childcare2025-10-25 14:00 - 15:35: Unpaid work - Errands2025-10-25 13:24 - 14:00: Discretionary - Productive - Music2025-10-25 12:34 - 13:24: Unpaid work - Laundry2025-10-25 09:12 - 12:34: A+ - Childcare2025-10-25 07:22 - 09:12: Sleep2025-10-25 07:17 - 07:22: A+ - Childcare2025-10-25 07:00 - 07:17: Personal - Routines2025-10-25 00:00 - 07:00: Sleep2025-10-24 23:15 - 00:00: Discretionary - Productive - Nonfiction2025-10-26 23:09 - 07:00: Sleep2025-10-26 22:33 - 23:09: Personal - Routines2025-10-26 19:21 - 22:33: A+ - Childcare2025-10-26 18:38 - 19:21: Personal - Routines2025-10-26 18:04 - 18:38: Unpaid work - Clean the kitchen2025-10-26 18:01 - 18:04: Personal - Routines2025-10-26 17:37 - 18:01: Personal - Routines2025-10-26 11:59 - 17:37: A+ - Childcare2025-10-26 11:46 - 11:59: Personal - Routines2025-10-26 10:22 - 11:46: A+ - Childcare2025-10-26 09:01 - 10:22: Personal - Walk - Other2025-10-26 07:52 - 09:01: A+ - Childcare2025-10-25 23:15 - 07:52: Sleep2025-10-27 22:59 - 07:10: Sleep2025-10-27 19:51 - 22:59: A+ - Childcare2025-10-27 19:21 - 19:51: Personal - Routines2025-10-27 18:58 - 19:21: Unpaid work - Clean the kitchen2025-10-27 18:28 - 18:58: Personal - Routines2025-10-27 18:03 - 18:28: Discretionary - Productive - Writing2025-10-27 17:26 - 18:03: Personal - Walk - Other2025-10-27 15:43 - 17:26: A+ - Childcare2025-10-27 14:54 - 15:43: Discretionary - Productive - Tracking2025-10-27 13:58 - 14:54: Discretionary - Productive - Emacs2025-10-27 13:42 - 13:58: Personal - Routines2025-10-27 13:08 - 13:42: Personal - Walk - Other2025-10-27 12:45 - 13:08: Discretionary - Productive - Emacs2025-10-27 12:21 - 12:45: Unpaid work - Clean the kitchen2025-10-27 11:29 - 12:21: Personal - Routines2025-10-27 11:14 - 11:29: A+ - Childcare2025-10-27 09:59 - 11:14: Discretionary - Productive - Emacs2025-10-27 09:34 - 09:59: Personal - Routines2025-10-27 09:16 - 09:34: Personal - Exercise2025-10-27 08:53 - 09:16: Discretionary - Productive - Music2025-10-27 07:23 - 08:53: A+ - Childcare2025-10-27 07:00 - 07:23: Personal - Routines2025-10-26 23:09 - 07:00: Sleep2025-10-28 23:09 - 07:10: Sleep2025-10-28 21:29 - 23:09: Discretionary - Productive - Drawing2025-10-28 20:19 - 21:29: Discretionary - Productive - Writing2025-10-28 18:53 - 20:19: Personal - Plan2025-10-28 18:38 - 18:53: Unpaid work - Clean the kitchen2025-10-28 15:42 - 18:38: Personal - Routines2025-10-28 14:42 - 15:42: Discretionary - Productive - Writing2025-10-28 13:45 - 14:42: Personal - Walk - Other2025-10-28 13:02 - 13:45: Personal - Routines2025-10-28 12:48 - 13:02: Business - Earn - Consulting - E1 - General2025-10-28 12:28 - 12:48: A+ - Childcare2025-10-28 12:25 - 12:28: Business - Earn - Consulting - E1 - General2025-10-28 11:16 - 12:25: Personal - Routines2025-10-28 10:56 - 11:16: Personal - Walk - Other2025-10-28 09:27 - 10:56: Discretionary - Productive - Writing2025-10-28 09:03 - 09:27: Personal - Exercise2025-10-28 08:42 - 09:03: Discretionary - Productive - Music2025-10-28 07:41 - 08:42: A+ - Childcare2025-10-28 07:12 - 07:41: Personal - Routines2025-10-28 07:11 - 07:12: A+ - Childcare2025-10-28 07:10 - 07:11: Personal - Routines2025-10-27 22:59 - 07:10: Sleep2025-10-29 22:09 - 06:30: Sleep2025-10-29 20:57 - 22:09: A+ - Childcare2025-10-29 20:16 - 20:57: Discretionary - Productive - Emacs2025-10-29 19:33 - 20:16: Personal - Routines2025-10-29 19:13 - 19:33: Unpaid work - Clean the kitchen2025-10-29 18:37 - 19:13: Personal - Routines2025-10-29 15:14 - 18:37: A+ - Childcare2025-10-29 14:08 - 15:14: Discretionary - Productive - Writing2025-10-29 12:17 - 14:08: Discretionary - Productive - Emacs2025-10-29 11:37 - 12:17: A+ - Childcare2025-10-29 11:30 - 11:37: Unpaid work - Clean the kitchen2025-10-29 10:41 - 11:30: Personal - Routines2025-10-29 10:38 - 10:41: Unpaid work - Cook2025-10-29 10:38 - 10:38: Personal - Routines2025-10-29 10:12 - 10:38: Personal - Exercise2025-10-29 09:47 - 10:12: Discretionary - Productive - Music2025-10-29 08:59 - 09:47: Personal - Walk - Other2025-10-29 08:34 - 08:59: Personal - Routines2025-10-29 07:49 - 08:34: A+ - Childcare2025-10-29 07:10 - 07:49: Personal - Routines2025-10-28 23:09 - 07:10: Sleep2025-10-30 23:16 - 07:00: Sleep2025-10-30 23:09 - 23:16: Personal - Routines2025-10-30 21:44 - 23:09: A+ - Childcare2025-10-30 21:43 - 21:44: Personal - Routines2025-10-30 20:37 - 21:43: Discretionary - Productive - Writing2025-10-30 20:07 - 20:37: Discretionary - Productive - Drawing2025-10-30 19:12 - 20:07: A+ - Childcare2025-10-30 18:52 - 19:12: Discretionary - Productive - Music2025-10-30 18:22 - 18:52: Personal - Routines2025-10-30 18:07 - 18:22: Unpaid work - Clean the kitchen2025-10-30 17:52 - 18:07: Personal - Routines2025-10-30 15:05 - 17:52: A+ - Childcare2025-10-30 14:35 - 15:05: Discretionary - Productive - Emacs2025-10-30 14:20 - 14:35: Personal - Plan2025-10-30 13:59 - 14:20: Discretionary - Productive - Bike Brigade2025-10-30 13:23 - 13:59: Discretionary - Productive - Writing2025-10-30 12:33 - 13:23: Unpaid work - Clean the kitchen2025-10-30 06:45 - 12:33: A+ - Childcare2025-10-30 06:30 - 06:45: Personal - Routines2025-10-29 22:09 - 06:30: Sleep2025-10-31 22:58 - 07:00: Sleep2025-10-31 22:56 - 22:58: Personal - Routines2025-10-31 21:32 - 22:56: A+ - Childcare2025-10-31 21:02 - 21:32: Personal - Routines2025-10-31 16:24 - 21:02: A+ - Childcare2025-10-31 15:25 - 16:24: Discretionary - Productive - Drawing2025-10-31 15:15 - 15:25: A+ - Childcare2025-10-31 15:06 - 15:15: Discretionary - Productive - Drawing2025-10-31 14:17 - 15:06: Personal - Routines2025-10-31 11:30 - 14:17: A+ - Childcare2025-10-31 10:54 - 11:30: Discretionary - Productive - French2025-10-31 10:40 - 10:54: Personal - Routines2025-10-31 09:48 - 10:40: Unpaid work - Errands2025-10-31 09:36 - 09:48: Unpaid work - Tidy up2025-10-31 09:11 - 09:36: Personal - Exercise2025-10-31 08:44 - 09:11: Discretionary - Productive - Music2025-10-31 07:19 - 08:44: A+ - Childcare2025-10-31 07:00 - 07:19: Personal - Routines2025-10-30 23:16 - 07:00: Sleep
View org source for this post

2025-11-03 Emacs news

| emacs, emacs-news

The Emacs Carnival blog theme for November is An Ode to Org Babel. Check out last month's posts about maintenance!

Links from reddit.com/r/emacs, r/orgmode, r/spacemacs, Mastodon #emacs, Bluesky #emacs, Hacker News, lobste.rs, programming.dev, lemmy.world, lemmy.ml, planet.emacslife.com, YouTube, the Emacs NEWS file, Emacs Calendar, and emacs-devel. Thanks to Andrés Ramírez for emacs-devel links. Do you have an Emacs-related link or announcement? Please e-mail me at sacha@sachachua.com. Thank you!

View org source for this post

consult + org-db-v3: Approximate search of my sketches using text, and a multi-source consult command for approximately searching sketches and blog posts

| emacs

I like to draw sketchnotes when I want to untangle a thought or build up a thought over several posts.1 Following up on Playing around with org-db-v3 and consult: vector search of my blog post Org files, with previews, I want to be able to search my sketches using approximate text matches. I also want to have an approximate search interface that includes both sketches and blog posts.

Here's what I've gotten working so far:

Screencast of my-sketch-similar and my-consult-similar

  • 0:00: Text preview: All right, so here's a preview of how I can flip through the images that are similar to my current text. Let's say, for example, I've got my-sketch-similar. I'm passing in my whole blog post. This one is a text preview. It just very quickly goes through the OCR text.
  • 0:27: Image preview: I can use the actual images since Emacs has image support. It's a bit slower and sometimes it doesn't work. So far it's working, which is nice, but you can tell there's a bit of a delay.
  • 0:51: External viewer like Geeqie: The third option is to use an external program like Geeqie. Geeqie? Anyway, that one seems a lot faster.
  • 1:12: my-consult-similar: Then I can use that with this new multiple source consult command that I've just defined. So, for example, if I say my-consult-similar, I can then flip through the related blog posts as well as the related sketches in one go. I was calling it with a C-u universal prefix argument, but I can also call it and type in, for example, parenting and anxiety. Then I can see my recent blog posts and sketches that are related to that topic. I think I should be able to just… Yes, if I press enter, it will insert the link. So that's what I hacked up today.

The data

As part of my sketchnote process,2 I convert my sketches to text files.3 I usually use Google Cloud Vision to automatically convert the images to text. By keeping .txt files beside image files, I can easily search for images and include them in blog posts.4 I usually edit the file afterwards to clean up the layound and fix misrecognized words, but even the raw text output can make files more searchable.

I indexed the sketches' text files with:

(defun my-org-db-v3-index-recent-sketches (after)
  (interactive (list
                (when current-prefix-arg
                  (org-read-date nil nil nil "After: " nil "-2w"))))
  (setq after (or after (org-read-date nil nil "-2w")))
  (mapcar #'org-db-v3-index-file-async
          (seq-remove
           (lambda (o) (string> after (file-name-base o)))
           (directory-files "~/sync/sketches" t "\\.txt$"))))

Completion code

Writing the Consult completion code for the sketches was pretty straightforward because I could base it on my blog posts.

(defun my-org-db-v3-sketch--collection (input)
  "Perform the RAG search and format the results for Consult.
Returns a list of cons cells (DISPLAY-STRING . PLIST)."
  (mapcar
   (lambda (o)
     (cons (file-name-base (alist-get 'source_path o)) o))
   (seq-uniq
    (my-org-db-v3-to-emacs-rag-search input 100 "%sync/sketches%")
    (lambda (a b) (string= (alist-get 'source_path a)
                           (alist-get 'source_path b))))))

(defun my-sketch-similar (&optional query hide-initial)
  "Vector-search blog posts using `emacs-rag-search' and present results via Consult.
If called with \\[universal-argument\], use the current post's text.
If a region is selected, use that as the default QUERY.
HIDE-INITIAL means hide the initial query, which is handy if the query is very long."
  (interactive (my-11ty-interactive-context current-prefix-arg))
  (consult--read
   (if hide-initial
       (my-org-db-v3-sketch--collection query)
     (consult--dynamic-collection
         #'my-org-db-v3-sketch--collection
       :min-input 3 :debounce 1))
   :lookup #'consult--lookup-cdr
   :prompt "Search sketches (approx): "
   :category 'sketch
   :sort nil
   :require-match t
   :state (my-image--state)
   :initial (unless hide-initial query)))

(defun my-sketch-similar-insert (link)
  "Vector-search sketches and insert a link.
If called with \\[universal-argument\], use the current post's text.
If a region is selected, use that as the default QUERY.
HIDE-INITIAL means hide the initial query, which is handy if the query is very long."
  (interactive (list
                (if embark--command
                    (read-string "Sketch: ")
                  (apply #'my-sketch-similar
                         (my-11ty-interactive-context current-prefix-arg)))))
  (my-insert-sketch-and-text link))

(defun my-sketch-similar-link (link)
  "Vector-search sketches and insert a link.
If called with \\[universal-argument\], use the current post's text.
If a region is selected, use that as the default QUERY.
HIDE-INITIAL means hide the initial query, which is handy if the query is very long."
  (interactive (list
                (if embark--command
                    (read-string "Sketch: ")
                  (apply #'my-sketch-similar
                         (my-11ty-interactive-context current-prefix-arg)))))
  (when (and (listp link) (alist-get 'source_path link))
    (setq link (my-image-filename (file-name-base link))))
  (insert (org-link-make-string (concat "sketchLink:" link) (file-name-base link))))

(From Handle sketches too in my config)

Previewing images

Displaying images in Emacs can be a little bit slow, so I wanted to have different options for preview. The fastest way might be to preview just the text to see whether this is a relevant image.

(setq my-sketch-preview 'text)
2025-10-29_14-46-06.png

Another way to preview to load the actual image, if I have a bit more patience.

(setq my-sketch-preview t)
2025-10-29_14-47-45.png
Figure 2: Screenshot of image preview

Sometimes Consult says "No partial preview of a binary file", though, so I can probably look into how to get around that.

Using an external program is another option. Here I have some code to use Geeqie to display the images.

(setq my-sketch-preview 'geeqie)
2025-10-29_14-48-57.png
Figure 3: Using Geeqie to flip through images

Using Geeqie feels faster and more reliable than using Emacs to preview images.

The preview is implemented by the following function in the Completing sketches part of my config.

(declare-function 'my-geeqie-view "Sacha.el")

(defvar my-sketch-preview 'text
  "*Preview sketches.
'text means show the associated text.
'geeqie means open image in Geeqie.
t means open image in Emacs.")

(defun my-image--state ()
  "Manage preview window and cleanup."
  ;; These functions are closures captured when the state is initialized by consult--read
  (let ((preview (consult--buffer-preview))
        (open (consult--temporary-files)))
    ;; The returned lambda is the actual preview function called by Consult
    (lambda (action cand)
      (unless cand
        (funcall open))
      (when my-sketch-preview
        (let ((filename (cond
                         ((and (eq my-sketch-preview 'text)
                               (listp cand)
                               (alist-get 'source_path cand))
                          (alist-get 'source_path cand))
                         ((and (listp cand)
                               (alist-get 'source_path cand))
                          (my-image-filename (file-name-base (alist-get 'source_path cand))))
                         (t cand))))
          (when filename
            (pcase my-sketch-preview
              ('geeqie (my-geeqie-view (list filename)))
              (_ (funcall preview action
                          (and cand
                               (eq action 'preview)
                               (funcall open filename)))))))))))

The following function calls geeqie. It's in the Manage photos with geeqie part of my config.

(defun my-geeqie-view (filenames)
  (interactive "f")
  (start-process-shell-command
   "geeqie" nil
   (concat
    "geeqie --remote "
    (mapconcat
     (lambda (f)
       (concat "file:" (shell-quote-argument f)))
     (cond
      ((listp filenames) filenames)
      ((file-directory-p filenames)
       (list (car (seq-filter #'file-regular-p (directory-files filenames t)))))
      (t (list filenames)))
     " "))))

Multiple sources

Now I can make a Consult source that combines both blog posts and sketches using semantic search. I wanted to have the same behaviour as my other functions. If I call it interactively, I want to type in text. If I call it with a region, I want to search for that region. If I call it with the universal prefix argument C-u, I want to use the current post text as a starting point. Since this behaviour shows up in several functions, I finally got around to writing a function that encapsulates it.

Then I can use that for the interactive arguments of my new my-consult-similar function.

(defvar my-consult-source-similar-blog-posts
  (list :name "Blog posts"
        :narrow ?b
        :category 'my-blog
        :state #'my-blog-post--state
        :async (consult--dynamic-collection
                   (lambda (input)
                     (seq-take
                      (my-org-db-v3-blog-post--collection input)
                      5)))
        :action #'my-embark-blog-insert-link))

(defvar my-consult-source-similar-sketches
  (list :name "Sketches"
        :narrow ?s
        :category 'sketch
        :async (consult--dynamic-collection
                   (lambda (input)
                     (seq-take (my-org-db-v3-sketch--collection input) 5)))
        :state #'my-image--state
        :action #'my-insert-sketch-and-text))

(defun my-consult-similar (query hide-initial)
  (interactive (my-11ty-interactive-context current-prefix-arg))
  (if hide-initial
      (let ((new-sources
             (list
              (append
               (copy-sequence my-consult-source-similar-blog-posts)
               (list :items (seq-take (my-org-db-v3-blog-post--collection query) 5)))
              (append
               (copy-sequence my-consult-source-similar-sketches)
               (list :items (seq-take (my-org-db-v3-sketch--collection query) 5))))))
        (dolist (source new-sources)
          (cl-remf source :async))
        (consult--multi new-sources))
    (consult--multi '(my-consult-source-similar-blog-posts
                      my-consult-source-similar-sketches)
                    :initial query)))

(defun my-org-db-v3-index-recent-public (after)
  (interactive (list
                (when current-prefix-arg
                  (org-read-date nil nil nil "After: " nil "-2w"))))
  (setq after (or after (org-read-date nil nil "-2w")))
  (mapc #'org-db-v3-index-file-async
        (my-blog-org-files-except-reviews after))
  (my-org-db-v3-index-recent-sketches after))

This is what it looks like given this whole post:

2025-10-29_14-36-24.png
Figure 4: Screenshot of semantic search for both blog posts and sketches

Thoughts and next steps

The vector search results from my sketches don't feel as relevant as the blog posts, possibly because there's a lot less text in my sketches. Handwriting is tiring, and I can only fit so much on a page. Still, now that I'm sorting results by similarity score, maybe we'll see what we get and how we can tweak things..

It might be nifty to use embark-become to switch between exact title match, full-text search, and vector search.

plz supports asynchronous requests and org-db-v3.el has examples of doing this, so maybe I can replicate some of Remembrance Agent's functionality by having an idle timer asynchronously update a dedicated buffer with resources that are similar to the current paragraph, or maybe the last X words near point.

I wonder if it makes sense to mix results from different sources in the same list instead of splitting it up into different categories.

View org source for this post

Playing around with org-db-v3 and consult: vector search of my blog post Org files, with previews

Posted: - Modified: | emacs, org

: Sort my-org-db-v3-to-emacs-rag-search by similarity score.

I tend to use different words even when I'm writing about the same ideas. When I use traditional search tools like grep, it can be hard to look up old blog posts or sketches if I can't think of the exact words I used. When I write a blog post, I want to automatically remind myself of possibly relevant notes without requiring words to exactly match what I'm looking for.

Demo

Here's a super quick demo of what I've been hacking together so far, doing vector search on some of my blog posts using the .org files I indexed with org-db-v3:

Screencast of my-blog-similar-link

Play by play:

  • 0:00:00 Use M-x my-blog-similar-link to look for "forgetting things", flip through results, and use RET to select one.
  • 0:00:25 Select "convert the text into a link" and use M-x my-blog-similar-link to change it into a link.
  • 0:00:44 I can call it with C-u M-x my-blog-similar-link and it will do the vector search using all of the post's text. This is pretty long, so I don't show it in the prompt.
  • 0:00:56 I can use Embark to select and insert multiple links. C-SPC selects them from the completion buffer, and C-. A acts on all of them.
  • 0:01:17 I can also use Embark's C-. S (embark-collect) to keep a snapshot that I can act on, and I can use RET in that buffer to insert the links.

Background

A few weeks ago, John Kitchin demonstrated a vector search server in his video Emacs RAG with LibSQL - Enabling semantic search of org-mode headings with Claude Code - YouTube. I checked out jkitchin/emacs-rag-libsql and got the server running. My system's a little slow (no GPU), so (setq emacs-rag-http-timeout nil) was helpful. It feels like a lighter-weight version of Khoj (which also supports Org Mode files) and maybe more focused on Org than jwiegley/rag-client. At the moment, I'm more interested in embeddings and vector/hybrid search than generating summaries or using a conversational interface, so something simple is fine. I just want a list of possibly-related items that I can re-read myself.

Of course, while these notes were languishing in my draft file, John Kitchin had already moved on to something else. He posted Fulltext, semantic text and image search in Emacs - YouTube, linking to a new vibe-coded project called org-db-v3 that promises to offer semantic, full-text, image, and headline search. The interface is ever so slightly different: POST instead of GET, a different data structure for results. Fortunately, it was easy enough to adapt my code. I just needed a small adapter function to make the output of org-db-v3 look like the output from emacs-rag-search.

(use-package org-db-v3
  :load-path "~/vendor/org-db-v3/elisp"
  :init
  (setq org-db-v3-auto-enable nil))

(defun my-org-db-v3-to-emacs-rag-search (query &optional limit filename-pattern)
  "Search org-db-v3 and transform the data to look like emacs-rag-search's output."
  (org-db-v3-ensure-server)
  (setq limit (or limit 100))
  (mapcar (lambda (o)
            `((source_path . ,(assoc-default 'filename o))
              (line_number . ,(assoc-default 'begin_line o))
              ,@o))
          (sort
           (assoc-default 'results
                          (plz 'post (concat (org-db-v3-server-url) "/api/search/semantic")
                            :headers '(("Content-Type" . "application/json"))
                            :body (json-encode `((query . ,query)
                                                 (limit . ,limit)
                                                 (filename_pattern . ,filename-pattern)))
                            :as #'json-read))
           :key (lambda (o) (alist-get 'similarity_score o))
           :reverse t)))

I'm assuming that org-db-v3 is what John's going to focus on instead of emacs-rag-search (for now, at least). I'll focus on that for the rest of this post, although I'll include some of the emacs-rag-search stuff just in case.

Indexing my Org files

Both emacs-rag and org-db-v3 index Org files by submitting them to a local web server. Here are the key files I want to index:

  • organizer.org: my personal projects and reference notes
  • reading.org: snippets from books and webpages
  • resources.org: bookmarks and frequently-linked sites
  • posts.org: draft posts
(dolist (file '("~/sync/orgzly/organizer.org"
                "~/sync/orgzly/posts.org"
                "~/sync/orgzly/reading.org"
                "~/sync/orgzly/resources.org"))
  (org-db-v3-index-file-async file))

(emacs-rag uses emacs-rag-index-file instead.)

Indexing blog posts via exported Org files

Then I figured I'd index my recent blog posts, except for the ones that are mostly lists of links, like Emacs News or my weekly/monthly/yearly reviews. I write my posts in Org Mode before exporting them with ox-11ty and converting them with the 11ty static site generator. I'd previously written some code to automatically export a copy of my Org draft in case people wanted to look at the source of a blog post, or in case I wanted to tweak the post in the future. (Handy for things like Org Babel.) This was generally exported as an index.org file in the post's directory. I can think of a few uses for a list of these files, so I'll make a function for it.

(defun my-blog-org-files-except-reviews (after-date)
  "Return a list of recent .org files except for Emacs News and weekly/monthly/yearly reviews.
AFTER-DATE is in the form yyyy, yyyy-mm, or yyyy-mm-dd."
  (setq after-date (or after-date "2020"))
  (let ((after-month (substring after-date 0 7))
        (posts (my-blog-posts)))
    (seq-keep
     (lambda (filename)
       (when (not (string-match "[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-emacs-news" filename))
         (when (string-match "/blog/\\([0-9]+\\)/\\([0-9]+\\)/" filename)
           (let ((month (match-string 2 filename))
                 (year (match-string 1 filename)))
             (unless (string> after-month
                              (concat year "-" month))
               (let ((info (my-blog-post-info-for-url (replace-regexp-in-string "~/proj/static-blog\\|index\\.org$\\|\\.org$" "" filename) posts)))
                 (let-alist info

                   (when (and
                          info
                          (string> .date after-date)
                          (not (seq-intersection .categories
                                                 '("emacs-news" "weekly" "monthly" "yearly")
                                                 'string=)))
                     filename))))))))
     (sort
      (directory-files-recursively "~/proj/static-blog/blog" "\\.org$")
      :lessp #'string<
      :reverse t))))

This is in the Listing exported Org posts section of my config. I have a my-blog-post-info-for-url function that helps me look up the categories. I get the data out of the JSON that has all of my blog posts in it.

Then it's easy to index those files:

(mapc #'org-db-v3-index-file-async (my-blog-org-files-except-reviews))

Searching my blog posts

Now that my files are indexed, I want to be able to turn up things that might be related to whatever I'm currently writing about. This might help me build up thoughts better, especially if a long time has passed in between posts.

org-db-v3-semantic-search-ivy didn't quite work for me out of the box, but I'd written an Consult-based interface for emacs-rag-search-vector that was easy to adapt. This is how I put it together.

First I started by looking at emacs-rag-search-vector. That shows the full chunks, which feels a little unwieldy.

2025-10-09_10-05-58.png
Figure 1: Screenshot showing the chunks returned by a search for "semantic search"

Instead, I wanted to see the years and titles of the blog posts as a quick summary, with the ability to page through them for a quick preview. consult.el lets me define a custom completion command with that behavior. Here's the code:

(defun my-blog-similar-link (link)
  "Vector-search blog posts using `emacs-rag-search' and insert a link.
If called with \\[universal-argument\], use the current post's text.
If a region is selected, use that as the default QUERY.
HIDE-INITIAL means hide the initial query, which is handy if the query is very long."
  (interactive (list
                (if embark--command
                    (read-string "Link: ")
                  (my-blog-similar
                   (cond
                    (current-prefix-arg (my-11ty-post-text))
                    ((region-active-p)
                     (buffer-substring (region-beginning)
                                       (region-end))))
                   current-prefix-arg))))
  (my-embark-blog-insert-link link))

(defun my-embark-blog--inject-target-url (&rest args)
  "Replace the completion text with the URL."
  (delete-minibuffer-contents)
  (insert (my-blog-url (get-text-property 0 'consult--candidate (plist-get args :target)))))

(with-eval-after-load 'embark
  (add-to-list 'embark-target-injection-hooks '(my-blog-similar-link my-embark-blog--inject-target-url)))

(defun my-11ty-interactive-context (use-post)
  "Returns (query hide-initial) for use in interactive arguments.
If USE-POST is non-nil, query is the current post text and hide-initial is t.
If the region is active, returns that as the query."
  (list (cond
         (embark--command (read-string "Input: "))
         (use-post (my-11ty-post-text))
         ((region-active-p)
          (buffer-substring (region-beginning)
                            (region-end))))
        use-post))

(defun my-blog-similar (&optional query hide-initial)
  "Vector-search blog posts using org-db-v3 and present results via Consult.
If called with \\[universal-argument\], use the current post's text.
If a region is selected, use that as the default QUERY.
HIDE-INITIAL means hide the initial query, which is handy if the query is very long."
  (interactive (my-11ty-interactive-context current-prefix-arg))
  (consult--read
   (if hide-initial
       (my-org-db-v3-blog-post--collection query)
     (consult--dynamic-collection
         #'my-org-db-v3-blog-post--collection
       :min-input 3 :debounce 1))
   :lookup #'consult--lookup-cdr
   :prompt "Search blog posts (approx): "
   :category 'my-blog
   :sort nil
   :require-match t
   :state (my-blog-post--state)
   :initial (unless hide-initial query)))

(defvar my-blog-semantic-search-source 'org-db-v3)
(defun my-org-db-v3-blog-post--collection (input)
  "Perform the RAG search and format the results for Consult.
Returns a list of cons cells (DISPLAY-STRING . PLIST)."
  (let ((posts (my-blog-posts)))
    (mapcar (lambda (o)
              (my-blog-format-for-completion
               (append o
                       (my-blog-post-info-for-url (alist-get 'source_path o)
                                                  posts))))
            (seq-uniq
               (my-org-db-v3-to-emacs-rag-search input 100 "%static-blog%")
               (lambda (a b) (string= (alist-get 'source_path a)
                                      (alist-get 'source_path b)))))))

It uses some functions I defined in other parts of my config:

When I explored emacs-rag-search, I also tried hybrid search (vector + full text). At first, I got "database disk image is malformed". I fixed this by dumping the SQLite3 database. Using hybrid search, I tended to get less-relevant results based on the repetition of common words, though, so that might be something for future exploration. Anyway, my-emacs-rag-search and my-emacs-rag-search-hybrid are in the emacs-rag-search part of my config just in case.

Along the way, I contributed some notes to consult.el's README.org so that it'll be easier to figure this stuff out in the future. In particular, it took me a while to figure out how to use :lookup #'consult--lookup-cdr to get richer information after selecting a completion candidate, and also how to use consult--dynamic-collection to work with slower dynamic sources.

Quick thoughts and next steps

It is kinda nice being able to look up posts without using the exact words.

Now I can display a list of blog posts that are somewhat similar to what I'm currently working on. It should be pretty straightforward to filter the list to show only posts I haven't linked to yet.

I can probably get this to index the text versions of my sketches, too.

It might also be interesting to have a multi-source Consult command that starts off with fast sources (exact title or headline match) and then adds the slower sources (Google web search, semantic blog post search via org-db-v3) as the results become available.

I'll save that for another post, though!

View org source for this post