June 2025: playdates, splash pads, sewing, Stardew

| monthly, review
June 2025: 🖼️💦🪴🪡🪡🙃🍦🚲🪡🍪😴🍦🚲🥔👴👰🍓🌧️🦕🌡🥧😷🌡🍓🎵🪡🏊🏺🐸🪡

Text from sketch

June 2025 2025-06-30-04 playdates, splash pads, sewing, Stardew

  1. 🖼️ art gallery
  2. 💦 splash pad
  3. 🪴 jump rope, seedlings
  4. 🪡 lots of sewing
  5. 🪡 sewed a hat
  6. 🙃 upside down with friends
  7. 🍦 radishes, ice cream
  8. 🚲 biked through rain
  9. 🪡 storage bag
  10. 🍪 cracker
  11. 😴 tough bedtime
  12. 🍦 ice cream bar
  13. 🚲 friend delivery
  14. 🥔 potato print, pizza party
  15. 👴 visited grandparents
  16. 👰 wedding dress in Stardew
  17. 🍓 hulled lots of strawberries
  18. 🌧️ rainy day, golden walnuts
  19. 🦕 ROM
  20. 🌡 sick day for A+
  21. 🥧 apple pies
  22. 😷 my turn to be sick
  23. 🌡 fever, naps
  24. 🍓 strawberries, lettuce, report card
  25. 🎵 stayed up for music homework
  26. 🪡 aprons
  27. 🏊 last day of school, first day of wading pool
  28. 🏺 pottery, two pies
  29. 🐸 hopping with J- & K-
  30. 🪡 swim skirt, 23x9= math

A+ finished virtual grade 3 and is now on summer break. I let her decide between mostly structured and mostly unstructured time. She picked mostly unstructured time, with one set of private swimming lessons at an outdoor pool and one week-long afternoon summer camp focused on pottery wheels. The rest of the time is for hanging out at splash pads, wading pools, and swimming pools, often with A+'s friends. When it's too hot even for that, we stay inside. There haven't been as many "I'm booored!"s as I expected. I think dealing with school gave her a lot of practice in managing boredom and coming up with her own activities, which is fantastic. It's important to be able to check in with herself and figure out what she's curious about, what she wants to do, and to know that she can come up with that instead of needing someone else to direct her day. Sometimes A+ uses Claude to help her write stories, sometimes she builds LEGO, sometimes she plays Minecraft or Stardew Valley, and sometimes she watches Clone Wars. Sometimes we tag along on W-'s Bike Brigade deliveries, so that's nice. Sometimes she helps me with sewing by doing straight seams, winding the bobbin, or threading the needle. She's been cubing again, packing a 3x3 Rubik's cube when she thinks there might be some waiting time. I still have the timer app on my phone, so she can check how she's doing. This feels like a good kind of busy: not externally imposed, but intrinsically motivated. Not regimented, but going with the flow.

A+ has lots of ideas for things to sew based on things she wants to wear or use, and is very much into having us both wear matching outfits. It turns out that I fit into kid-sized Crocs, so it's easy to get matching colours there too. The pendulum of childhood, I guess. We're currently on the "let's match" side, and then we'll swing over to individuation, and then we'll swing back, and then further out to individuation, and so on. I love that we can explore this through our clothes, shoes, and interests. Some days she wants to be just like me, and almost physically tries to occupy the same space. (Cuddles are great! I know this opportunity is time-limited.) Other days she grumps at me and nothing I say is right. It's great to be able to not take it personally. It's all part of healthy development.

We're making quick progress through my fabric stash. I've been making clothes: mostly training bras, skorts, and swim skirts out of Spandex so that we can wear it straight into the pool and out again. I've even been able to make a few clothes for me instead of just for her. I used godets to turn last year's swim skirt for A+ into a swim skirt for me, and I added in-seam pockets. Pockets are great for stashing goggles, glasses, and diving toys. I want pockets in everything now. It's nice getting the hang of more of these little techniques, especially since it means I can turn more scraps and outgrown clothes into new things. I sewed a large zippered liner for W-'s drawer so that we could protect out-of-season wool clothes and blankets from moths. I used the leftover canvas to make a bag for A+ so that she could shop for snacks independently, since the reusable bags from the store dragged on the ground when she held them in her hand. This one is just the right size. It's great to be able to make things that fit. I also made aprons for her and one of her friends, whom we treated to a pottery class. A+ enjoyed potato-printing her bag and apron at the Bike Brigade x Not Far From the Tree pizza party at the park, which was a lot of fun. It might be interesting to pick up more paintable/dyeable fabric and some fabric paint so that we can make our own designs.

A+ was briefly sick with a fever, and then I had a sore throat and a fever too. Now no one has a fever, but I still have a persistent cough. We think we might have picked something up at the party. Even though it was outdoors it was a bit crowded, lots of people were talking, and we hadn't worn our masks. Oh well, just gotta do better next time and mask up at big events. At least I'm still testing negative for COVID. I'm masking at home so that W- doesn't get sick, and generally taking it easy. We got a membership for the ROM, but the annoyance of this cough is making me extra grumpy about crowds and indoor things, so it might be a while before we're back. Plenty to do outdoors now that the weather is warm and her friends play outside.

I probably should sleep more, but I've been staying up to play Stardew Valley, which you'd be able to tell from my time records. I like the game. Even the kiddo is learning to slow down and take care of her farm. Sometimes we play co-op, and sometimes we work on our own playthroughs. I have a fairly built-up standard farm playthrough where I let A+ take over Ginger Island. I'm proud of how I successfully didn't grump when she decided to rip up most of my starfruit plants there and then ended up not replacing them with anything. Not even a blip of grumpiness. I already had more money than I felt like spending, thanks to the ancient fruit winery I'd set up. Aside from cooking and puttering around with the sewing machine, A+ also liked giving my character relationship advice. She encouraged me to marry Emily, pronouncing her the most compatible. (She married Elliott in her own playthrough.) After I gave Emily the mermaid pendant and came back to the farmhouse, A+ had set up a mannequin with a full wedding outfit as a gift for me. She was proud of gathering all the materials needed and sewing the virtual outfit herself. I love that the sandbox nature of the game lets her come up with her own ideas and make things happen.

I also have a four corners farm with remixed bundles where I've just completed the community centre and I'm now slowly collecting hardwood for the boat to Ginger Island. I've developed an appreciation for the fishing minigame that I used to avoid. It's a great way to get treasure. Anyway, Stardew is a pleasant enough way to spend little bits of time here and there, and to relax after A+'s bedtime. It's encouraging to see that I could actually find plenty of discretionary time in my day for playing, and I can use that time for other things once this hyperfocus passes.

Our real-life garden is doing all right, too. Most of the remaining radishes have bolted, although some of the larger ones are still growing well. In spring I gave A+ a bunch of seed packets and let her plant entirely at her own discretion. I've been having fun figuring out how to identify and manage the results, thinning out the ones that are definitely not what we're looking for in that space or that just need a little more spacing. We get a lot of volunteer tomatoes, perilla, goosefoot, wood sorrel, and clover. I've been putting those in the compost to make room for the marigolds and poppies that I recognize from the seed packet pictures. I'm learning to identify other plants as they grow. It's fun letting A+ try whatever she likes and then figuring out how to work with that. It's also fun blending the real-life world and the virtual world. We make the sound effect from Stardew Valley when we uproot our radishes and hold them up above our heads.

Taking advantage of those last days of predictable focus time while virtual school was in session, I got the ball rolling for EmacsConf 2025 with the call for participation. I also enjoyed attending the virtual Emacs Berlin meetup and taking notes. I wrote a bunch of blog posts, too.

We'll see how my focused time settles down now that we're on summer schedule. It turns out that I still have plenty of free time. The daytime part is just more interruptible now because I want to be ready to do something with A+ or head out the door when A+ expresses an interest in going to a playdate or a pool. I still want to get my own stuff done instead of feeling like I'm on standby, so it's great that my notes make it easier for me to make progress in stop-and-go segments. I want her to feel like I'm happy to spend time with her instead of being distracted by an interrupted task. I also want her to see how I choose things to do with my time and how I use notes to help me work around the limitations of my brain and my attention. It's an interesting challenge balancing between occupation and flexibility. I want her to enjoy unstructured time and to be able to shift between solo interests and shared time according to the rhythms of her energy.

July is probably going to be about hanging out with A+ near some kind of water. I like this approach of trusting her to manage her time and attention, letting her take the initiative when it comes to going out and playing with friends or swimming in the pool. In the meantime, there's time for me to write and play.

Blog posts

Sketches

Time

Category Previous month % This month % Diff % h/wk Diff h/wk
Discretionary - Play 3.7 14.6 10.9 23.7 18.2
Discretionary - Productive 12.5 14.8 2.3 24.0 3.8
Personal 10.7 11.5 0.8 18.7 1.4
Discretionary - Family 0.2 0.3 0.1 0.5 0.2
Business 2.0 0.9 -1.1 1.4 -1.9
Unpaid work 5.7 4.5 -1.2 7.3 -2.0
Sleep 31.3 27.3 -4.0 44.3 -6.7
A+ 33.9 26.3 -7.7 42.7 -12.9
2025-06-01 23:23 - 00:53: Discretionary - Play - Stardew Valley2025-06-01 22:05 - 23:23: Discretionary - Productive - Writing2025-06-01 21:33 - 22:05: A+ - Childcare2025-06-01 21:03 - 21:33: A+ - Childcare2025-06-01 19:19 - 21:03: Discretionary - Play - Stardew Valley2025-06-01 18:46 - 19:19: Personal - Routines2025-06-01 18:11 - 18:46: Unpaid work - Clean the kitchen2025-06-01 17:23 - 18:11: A+ - Childcare2025-06-01 17:10 - 17:23: Personal - Routines2025-06-01 16:09 - 17:10: Sleep2025-06-01 15:54 - 16:09: A+ - Childcare2025-06-01 15:39 - 15:54: Unpaid work - Clean the kitchen2025-06-01 09:26 - 15:39: A+ - Childcare2025-06-01 09:06 - 09:26: Discretionary - Productive - Music2025-06-01 08:33 - 09:06: Discretionary - Productive - Gardening2025-06-01 08:18 - 08:33: Unpaid work - Laundry2025-06-01 07:01 - 08:18: A+ - Childcare2025-06-01 06:46 - 07:01: Personal - Routines2025-06-01 06:46 - 06:46: Personal - Routines2025-06-01 06:36 - 06:46: Discretionary - Productive - Bike Brigade2025-06-01 06:32 - 06:36: Personal - Routines2025-06-01 00:36 - 06:32: Sleep2025-05-31 23:58 - 00:36: Discretionary - Play - Stardew Valley2025-06-02 22:44 - 00:15: Discretionary - Play - Stardew Valley2025-06-02 22:39 - 22:44: Personal - Routines2025-06-02 20:51 - 22:39: A+ - Childcare2025-06-02 20:21 - 20:51: Personal - Routines2025-06-02 20:11 - 20:21: A+ - Childcare2025-06-02 18:39 - 20:11: Discretionary - Play - Stardew Valley2025-06-02 18:24 - 18:39: Unpaid work - Clean the kitchen2025-06-02 17:54 - 18:24: A+ - Childcare2025-06-02 17:23 - 17:54: Discretionary - Play - Stardew Valley2025-06-02 17:22 - 17:23: Business - Earn - Consulting - E1 - General2025-06-02 14:45 - 17:22: A+ - Childcare2025-06-02 13:55 - 14:45: Discretionary - Productive - Emacs2025-06-02 13:45 - 13:55: Unpaid work - Clean the kitchen2025-06-02 12:59 - 13:45: Personal - Routines2025-06-02 12:12 - 12:59: Discretionary - Productive - Emacs2025-06-02 12:05 - 12:12: Unpaid work - Cook2025-06-02 12:02 - 12:05: Discretionary - Productive - Emacs2025-06-02 09:59 - 12:02: Personal - Routines2025-06-02 09:33 - 09:59: A+ - Childcare2025-06-02 08:58 - 09:33: Discretionary - Productive - Emacs2025-06-02 08:44 - 08:58: Discretionary - Productive - Music2025-06-02 08:22 - 08:44: Discretionary - Productive - Gardening2025-06-02 07:37 - 08:22: A+ - Childcare2025-06-02 06:56 - 07:37: Personal - Routines2025-06-02 00:53 - 06:56: Sleep2025-06-01 23:23 - 00:53: Discretionary - Play - Stardew Valley2025-06-03 22:11 - 00:29: Discretionary - Play - Stardew Valley2025-06-03 22:09 - 22:11: Personal - Routines2025-06-03 21:39 - 22:09: A+ - Childcare2025-06-03 20:50 - 21:39: Personal - Routines2025-06-03 18:25 - 20:50: A+ - Childcare2025-06-03 18:05 - 18:25: Unpaid work - Cook2025-06-03 14:48 - 18:05: A+ - Childcare2025-06-03 14:03 - 14:48: Discretionary - Play - Stardew Valley2025-06-03 13:38 - 14:03: Business - Earn - Consulting - E1 - General2025-06-03 13:21 - 13:38: A+ - Childcare2025-06-03 13:17 - 13:21: Business - Earn - Consulting - E1 - General2025-06-03 13:08 - 13:17: Discretionary - Play - Stardew Valley2025-06-03 12:45 - 13:08: Business - Earn - Consulting - E1 - General2025-06-03 11:15 - 12:45: Discretionary - Productive - Gardening2025-06-03 11:11 - 11:15: A+ - Childcare2025-06-03 10:16 - 11:11: Discretionary - Productive - Gardening2025-06-03 10:08 - 10:16: Discretionary - Play - Stardew Valley2025-06-03 09:54 - 10:08: Business - Earn - Consulting - E1 - General2025-06-03 09:40 - 09:54: A+ - Childcare2025-06-03 09:36 - 09:40: Business - Earn - Consulting - E1 - General2025-06-03 08:53 - 09:36: Discretionary - Productive - Music2025-06-03 08:26 - 08:53: Discretionary - Productive - Gardening2025-06-03 06:55 - 08:26: A+ - Childcare2025-06-03 00:15 - 06:55: Sleep2025-06-02 22:44 - 00:15: Discretionary - Play - Stardew Valley2025-06-04 22:39 - 00:24: Discretionary - Play - Stardew Valley2025-06-04 22:35 - 22:39: Personal - Routines2025-06-04 21:07 - 22:35: A+ - Childcare2025-06-04 21:02 - 21:07: Unpaid work - Cook2025-06-04 20:13 - 21:02: Personal - Routines2025-06-04 20:05 - 20:13: Discretionary - Play - Stardew Valley2025-06-04 19:45 - 20:05: Unpaid work - Cook2025-06-04 19:44 - 19:45: Personal - Routines2025-06-04 19:24 - 19:44: Unpaid work - Clean the kitchen2025-06-04 18:53 - 19:24: Personal - Routines2025-06-04 18:03 - 18:53: Discretionary - Productive - Bike Brigade2025-06-04 14:57 - 18:03: A+ - Childcare2025-06-04 14:27 - 14:57: Unpaid work - Tidy up2025-06-04 14:09 - 14:27: Discretionary - Productive - Gardening2025-06-04 12:05 - 14:09: Discretionary - Productive - Sewing2025-06-04 11:05 - 12:05: A+ - Childcare2025-06-04 09:53 - 11:05: Discretionary - Productive - Sewing2025-06-04 09:49 - 09:53: A+ - Childcare2025-06-04 09:49 - 09:49: Discretionary - Play - Stardew Valley2025-06-04 09:37 - 09:49: A+ - Childcare2025-06-04 09:05 - 09:37: Discretionary - Productive - Music2025-06-04 08:56 - 09:05: Unpaid work - Clean the kitchen2025-06-04 08:38 - 08:56: Unpaid work - Cook2025-06-04 08:24 - 08:38: Discretionary - Productive - Gardening2025-06-04 07:24 - 08:24: A+ - Childcare2025-06-04 06:55 - 07:24: Personal - Routines2025-06-04 00:29 - 06:55: Sleep2025-06-03 22:11 - 00:29: Discretionary - Play - Stardew Valley2025-06-05 22:28 - 00:22: Discretionary - Play - Stardew Valley2025-06-05 22:08 - 22:28: Personal - Routines2025-06-05 21:04 - 22:08: A+ - Childcare2025-06-05 20:34 - 21:04: Personal - Routines2025-06-05 17:35 - 20:34: A+ - Childcare2025-06-05 17:20 - 17:35: Discretionary - Productive - Bike Brigade2025-06-05 17:09 - 17:20: A+ - Childcare2025-06-05 17:02 - 17:09: Discretionary - Productive - Bike Brigade2025-06-05 14:51 - 17:02: A+ - Childcare2025-06-05 14:37 - 14:51: Discretionary - Productive - Writing2025-06-05 14:22 - 14:37: Discretionary - Productive - Writing2025-06-05 12:39 - 14:22: Unpaid work - Tidy up2025-06-05 12:12 - 12:39: Discretionary - Productive - Sewing2025-06-05 11:57 - 12:12: Unpaid work - Tidy up2025-06-05 11:08 - 11:57: A+ - Childcare2025-06-05 10:53 - 11:08: Personal - Routines2025-06-05 09:27 - 10:53: Discretionary - Productive - Bike Brigade2025-06-05 09:27 - 09:27: A+ - Childcare2025-06-05 08:41 - 09:27: Discretionary - Productive - Music2025-06-05 08:24 - 08:41: Unpaid work - Clean the kitchen2025-06-05 08:18 - 08:24: Discretionary - Productive - Gardening2025-06-05 07:29 - 08:18: A+ - Childcare2025-06-05 06:50 - 07:29: Personal - Routines2025-06-05 00:28 - 06:50: Sleep2025-06-05 00:24 - 00:28: Sleep2025-06-04 22:39 - 00:24: Discretionary - Play - Stardew Valley2025-06-06 23:48 - 00:44: Discretionary - Play - Stardew Valley2025-06-06 23:42 - 23:48: Personal - Routines2025-06-06 22:35 - 23:42: A+ - Childcare2025-06-06 22:35 - 22:35: A+ - Childcare2025-06-06 22:24 - 22:35: Discretionary - Play - Stardew Valley2025-06-06 22:23 - 22:24: Personal - Routines2025-06-06 21:05 - 22:23: A+ - Childcare2025-06-06 20:54 - 21:05: Discretionary - Play - Stardew Valley2025-06-06 20:24 - 20:54: Discretionary - Productive - Music2025-06-06 20:10 - 20:24: Business - Earn - Consulting - E1 - General2025-06-06 19:55 - 20:10: Personal - Routines2025-06-06 19:13 - 19:55: Discretionary - Productive - Bike Brigade2025-06-06 10:00 - 19:13: A+ - Childcare2025-06-06 09:44 - 10:00: Unpaid work - Clean the kitchen2025-06-06 09:28 - 09:44: Personal - Routines2025-06-06 09:16 - 09:28: Discretionary - Productive - Sewing2025-06-06 08:27 - 09:16: Discretionary - Productive - Gardening2025-06-06 07:14 - 08:27: A+ - Childcare2025-06-06 00:22 - 07:14: Sleep2025-06-05 22:28 - 00:22: Discretionary - Play - Stardew Valley2025-06-07 22:57 - 00:03: Personal - Routines2025-06-07 22:56 - 22:57: Discretionary - Play - Stardew Valley2025-06-07 22:41 - 22:56: Personal - Routines2025-06-07 21:36 - 22:41: A+ - Childcare2025-06-07 21:21 - 21:36: Unpaid work - Laundry2025-06-07 20:42 - 21:21: Discretionary - Play - Stardew Valley2025-06-07 20:06 - 20:42: Personal - Routines2025-06-07 17:48 - 20:06: A+ - Childcare2025-06-07 16:47 - 17:48: Discretionary - Productive - Writing2025-06-07 15:46 - 16:47: Personal - Walk - Other2025-06-07 15:31 - 15:46: Discretionary - Productive - Writing2025-06-07 14:41 - 15:31: Personal - Routines2025-06-07 14:01 - 14:41: Personal - Walk - Other2025-06-07 10:40 - 14:01: A+ - Childcare2025-06-07 10:19 - 10:40: Discretionary - Productive - Music2025-06-07 09:11 - 10:19: Discretionary - Productive - Bike Brigade2025-06-07 06:36 - 09:11: Personal - Routines2025-06-07 00:44 - 06:36: Sleep2025-06-06 23:48 - 00:44: Discretionary - Play - Stardew Valley2025-06-08 23:11 - 00:41: Discretionary - Play - Stardew Valley2025-06-08 20:57 - 23:11: A+ - Childcare2025-06-08 20:27 - 20:57: Personal - Routines2025-06-08 20:10 - 20:27: Unpaid work - Clean the kitchen2025-06-08 16:21 - 20:10: A+ - Childcare2025-06-08 15:21 - 16:21: Unpaid work - Cook2025-06-08 13:53 - 15:21: Discretionary - Play - Stardew Valley2025-06-08 13:43 - 13:53: Unpaid work - Clean the kitchen2025-06-08 13:21 - 13:43: Personal - Routines2025-06-08 13:07 - 13:21: Unpaid work - Clean the kitchen2025-06-08 12:32 - 13:07: Personal - Routines2025-06-08 09:28 - 12:32: Discretionary - Productive - Sewing2025-06-08 08:57 - 09:28: Discretionary - Productive - Gardening2025-06-08 08:56 - 08:57: Unpaid work - Clean the kitchen2025-06-08 08:40 - 08:56: Discretionary - Productive - Music2025-06-08 08:40 - 08:40: A+ - Childcare2025-06-08 08:31 - 08:40: Discretionary - Productive - Music2025-06-08 07:18 - 08:31: A+ - Childcare2025-06-08 06:55 - 07:18: Personal - Routines2025-06-08 00:33 - 06:55: Sleep2025-06-08 00:03 - 00:33: Discretionary - Play - Stardew Valley2025-06-07 22:57 - 00:03: Personal - Routines2025-06-09 23:03 - 06:00: Sleep2025-06-09 23:00 - 23:03: Personal - Routines2025-06-09 21:27 - 23:00: A+ - Childcare2025-06-09 20:53 - 21:27: Discretionary - Productive - Writing2025-06-09 20:02 - 20:53: Discretionary - Productive - Drawing2025-06-09 19:34 - 20:02: Personal - Routines2025-06-09 19:07 - 19:34: Unpaid work - Clean the kitchen2025-06-09 18:22 - 19:07: Personal - Routines2025-06-09 17:06 - 18:22: Discretionary - Productive - Writing2025-06-09 16:42 - 17:06: A+ - Childcare2025-06-09 16:32 - 16:42: Discretionary - Productive - Writing2025-06-09 16:27 - 16:32: Personal - Routines2025-06-09 15:53 - 16:27: Discretionary - Productive - Gardening2025-06-09 12:38 - 15:53: Discretionary - Productive - Sewing2025-06-09 12:20 - 12:38: A+ - Childcare2025-06-09 12:03 - 12:20: Discretionary - Productive - Sewing2025-06-09 11:02 - 12:03: A+ - Childcare2025-06-09 10:59 - 11:02: Discretionary - Productive - Music2025-06-09 10:29 - 10:59: Unpaid work - Cook2025-06-09 10:10 - 10:29: Discretionary - Productive - Emacs2025-06-09 10:02 - 10:10: Discretionary - Productive - Emacs2025-06-09 08:58 - 10:02: A+ - Childcare2025-06-09 08:17 - 08:58: Discretionary - Productive - Emacs2025-06-09 06:55 - 08:17: Personal - Routines2025-06-09 00:41 - 06:55: Sleep2025-06-08 23:11 - 00:41: Discretionary - Play - Stardew Valley2025-06-10 22:42 - 00:55: Discretionary - Play - Stardew Valley2025-06-10 20:42 - 22:42: A+ - Childcare2025-06-10 19:42 - 20:42: Discretionary - Play - Stardew Valley2025-06-10 19:16 - 19:42: Personal - Routines2025-06-10 18:56 - 19:16: Unpaid work - Clean the kitchen2025-06-10 18:24 - 18:56: Personal - Routines2025-06-10 14:40 - 18:24: A+ - Childcare2025-06-10 14:30 - 14:40: Business - Earn - Consulting - E1 - General2025-06-10 14:07 - 14:30: Discretionary - Productive - Drawing2025-06-10 12:37 - 14:07: Discretionary - Productive - Writing2025-06-10 12:17 - 12:37: Discretionary - Productive - Bike Brigade2025-06-10 12:04 - 12:17: Discretionary - Productive - Writing2025-06-10 11:03 - 12:04: A+ - Childcare2025-06-10 10:32 - 11:03: Discretionary - Productive - Writing2025-06-10 09:02 - 10:32: Discretionary - Productive - Music2025-06-10 08:53 - 09:02: Unpaid work - Cook2025-06-10 08:30 - 08:53: Discretionary - Productive - Gardening2025-06-10 08:22 - 08:30: Personal - Routines2025-06-10 07:52 - 08:22: A+ - Childcare2025-06-10 07:33 - 07:52: Discretionary - Productive - Music2025-06-10 07:03 - 07:33: A+ - Childcare2025-06-10 06:00 - 07:03: Personal - Routines2025-06-09 23:03 - 06:00: Sleep2025-06-11 23:31 - 00:27: Discretionary - Family2025-06-11 23:10 - 23:31: Discretionary - Play - Stardew Valley2025-06-11 22:31 - 23:10: Discretionary - Family2025-06-11 22:24 - 22:31: Personal - Routines2025-06-11 21:54 - 22:24: A+ - Childcare2025-06-11 19:37 - 21:54: Discretionary - Play - Stardew Valley2025-06-11 19:07 - 19:37: Personal - Routines2025-06-11 19:02 - 19:07: Unpaid work - Clean the kitchen2025-06-11 18:46 - 19:02: Personal - Routines2025-06-11 18:09 - 18:46: Unpaid work - Cook2025-06-11 15:00 - 18:09: A+ - Childcare2025-06-11 14:50 - 15:00: Personal - Routines2025-06-11 14:21 - 14:50: Discretionary - Productive - Writing2025-06-11 13:59 - 14:21: Business - Earn - Consulting - E1 - General2025-06-11 13:47 - 13:59: Discretionary - Productive - Writing2025-06-11 13:40 - 13:47: Personal - Routines2025-06-11 13:38 - 13:40: Business - Earn - Consulting - E1 - General2025-06-11 13:38 - 13:38: Personal - Routines2025-06-11 13:22 - 13:38: A+ - Childcare2025-06-11 13:13 - 13:22: Discretionary - Play - Stardew Valley2025-06-11 12:13 - 13:13: Business - Earn - Consulting - E1 - General2025-06-11 11:01 - 12:13: A+ - Childcare2025-06-11 09:58 - 11:01: Business - Earn - Consulting - E1 - General2025-06-11 09:39 - 09:58: A+ - Childcare2025-06-11 09:13 - 09:39: Discretionary - Productive - Music2025-06-11 09:08 - 09:13: Unpaid work - Cook2025-06-11 08:58 - 09:08: Discretionary - Productive - Gardening2025-06-11 08:20 - 08:58: Unpaid work - Cook2025-06-11 06:57 - 08:20: Personal - Routines2025-06-11 06:57 - 06:57: Unpaid work - Subway2025-06-11 00:55 - 06:57: Sleep2025-06-10 22:42 - 00:55: Discretionary - Play - Stardew Valley2025-06-12 22:23 - 00:28: Discretionary - Play - Stardew Valley2025-06-12 22:02 - 22:23: Personal - Routines2025-06-12 21:17 - 22:02: A+ - Childcare2025-06-12 18:57 - 21:17: Discretionary - Play - Stardew Valley2025-06-12 18:27 - 18:57: Personal - Routines2025-06-12 14:40 - 18:27: A+ - Childcare2025-06-12 13:40 - 14:40: Discretionary - Play - Stardew Valley2025-06-12 12:09 - 13:40: Discretionary - Productive - Bike Brigade2025-06-12 11:23 - 12:09: A+ - Childcare2025-06-12 11:01 - 11:23: Discretionary - Productive - Writing2025-06-12 10:21 - 11:01: Discretionary - Play - Stardew Valley2025-06-12 10:19 - 10:21: Personal - Routines2025-06-12 09:59 - 10:19: Discretionary - Productive - Music2025-06-12 09:39 - 09:59: A+ - Childcare2025-06-12 08:31 - 09:39: Unpaid work - Cook2025-06-12 07:31 - 08:31: A+ - Childcare2025-06-12 06:57 - 07:31: Personal - Routines2025-06-12 01:01 - 06:57: Sleep2025-06-12 00:27 - 01:01: Discretionary - Play - Stardew Valley2025-06-11 23:31 - 00:27: Discretionary - Family2025-06-13 22:50 - 00:43: Discretionary - Play - Stardew Valley2025-06-13 22:39 - 22:50: Personal - Routines2025-06-13 21:30 - 22:39: A+ - Childcare2025-06-13 19:59 - 21:30: Discretionary - Play - Stardew Valley2025-06-13 18:57 - 19:59: Personal - Routines2025-06-13 18:42 - 18:57: Unpaid work - Clean the kitchen2025-06-13 18:12 - 18:42: Personal - Routines2025-06-13 17:36 - 18:12: Discretionary - Productive - Writing2025-06-13 15:35 - 17:36: A+ - Childcare2025-06-13 15:05 - 15:35: Discretionary - Productive - Writing2025-06-13 14:39 - 15:05: Personal - Routines2025-06-13 12:35 - 14:39: Discretionary - Play - Stardew Valley2025-06-13 11:35 - 12:35: Discretionary - Productive - Sewing2025-06-13 11:02 - 11:35: A+ - Childcare2025-06-13 10:52 - 11:02: Business - Earn - Consulting - E1 - General2025-06-13 10:23 - 10:52: Personal - Routines2025-06-13 10:00 - 10:23: Discretionary - Productive - Writing2025-06-13 09:56 - 10:00: Business - Earn - Consulting - E1 - General2025-06-13 09:36 - 09:56: A+ - Childcare2025-06-13 08:44 - 09:36: Discretionary - Productive - Music2025-06-13 08:34 - 08:44: Unpaid work - Clean the kitchen2025-06-13 08:21 - 08:34: Discretionary - Productive - Gardening2025-06-13 06:59 - 08:21: A+ - Childcare2025-06-13 00:33 - 06:59: Sleep2025-06-13 00:28 - 00:33: Personal - Routines2025-06-12 22:23 - 00:28: Discretionary - Play - Stardew Valley2025-06-14 23:03 - 01:05: Discretionary - Play - Stardew Valley2025-06-14 22:55 - 23:03: Personal - Routines2025-06-14 21:27 - 22:55: A+ - Childcare2025-06-14 20:28 - 21:27: Discretionary - Play - Stardew Valley2025-06-14 20:01 - 20:28: Personal - Routines2025-06-14 19:06 - 20:01: Discretionary - Productive - Bike Brigade2025-06-14 18:51 - 19:06: Personal - Routines2025-06-14 18:40 - 18:51: Unpaid work - Clean the kitchen2025-06-14 18:16 - 18:40: Personal - Routines2025-06-14 17:46 - 18:16: Discretionary - Productive - Bike Brigade2025-06-14 11:14 - 17:46: A+ - Childcare2025-06-14 11:02 - 11:14: Discretionary - Productive - Bike Brigade2025-06-14 09:02 - 11:02: Discretionary - Productive - Sewing2025-06-14 08:50 - 09:02: Unpaid work - Clean the kitchen2025-06-14 07:20 - 08:50: A+ - Childcare2025-06-14 06:59 - 07:20: Personal - Routines2025-06-14 00:43 - 06:59: Sleep2025-06-13 22:50 - 00:43: Discretionary - Play - Stardew Valley2025-06-15 23:14 - 01:03: Discretionary - Play - Stardew Valley2025-06-15 23:11 - 23:14: Personal - Routines2025-06-15 21:06 - 23:11: A+ - Childcare2025-06-15 20:36 - 21:06: Personal - Routines2025-06-15 20:20 - 20:36: Unpaid work - Laundry2025-06-15 19:50 - 20:20: Discretionary - Play - Stardew Valley2025-06-15 19:04 - 19:50: Personal - Routines2025-06-15 18:50 - 19:04: Unpaid work - Cook2025-06-15 18:30 - 18:50: Unpaid work - Clean the kitchen2025-06-15 17:45 - 18:30: Personal - Routines2025-06-15 16:43 - 17:45: Discretionary - Play - Stardew Valley2025-06-15 15:58 - 16:43: Discretionary - Productive - Gardening2025-06-15 14:03 - 15:58: Personal - Routines2025-06-15 07:54 - 14:03: A+ - Childcare2025-06-15 06:54 - 07:54: Personal - Routines2025-06-15 01:05 - 06:54: Sleep2025-06-14 23:03 - 01:05: Discretionary - Play - Stardew Valley2025-06-16 22:58 - 01:08: Discretionary - Play - Stardew Valley2025-06-16 22:56 - 22:58: Personal - Routines2025-06-16 19:45 - 22:56: A+ - Childcare2025-06-16 19:15 - 19:45: Personal - Routines2025-06-16 18:34 - 19:15: Discretionary - Play - Stardew Valley2025-06-16 18:33 - 18:34: Unpaid work - Tidy up2025-06-16 18:29 - 18:33: Business - Earn - Consulting - E1 - General2025-06-16 18:15 - 18:29: Discretionary - Play - Stardew Valley2025-06-16 18:10 - 18:15: Business - Earn - Consulting - E1 - General2025-06-16 17:40 - 18:10: Personal - Routines2025-06-16 17:25 - 17:40: Unpaid work - Clean the kitchen2025-06-16 17:10 - 17:25: Personal - Routines2025-06-16 16:40 - 17:10: Unpaid work - Clean the kitchen2025-06-16 16:04 - 16:40: Personal - Routines2025-06-16 15:12 - 16:04: Discretionary - Productive - Writing2025-06-16 14:45 - 15:12: A+ - Childcare2025-06-16 14:42 - 14:45: Personal - Routines2025-06-16 14:23 - 14:42: Discretionary - Productive - Emacs2025-06-16 14:05 - 14:23: Business - Earn - Consulting - E1 - General2025-06-16 14:00 - 14:05: Discretionary - Productive - Emacs2025-06-16 13:50 - 14:00: Discretionary - Productive - Emacs2025-06-16 13:37 - 13:50: Business - Earn - Consulting - E1 - General2025-06-16 13:13 - 13:37: Discretionary - Play - Stardew Valley2025-06-16 12:25 - 13:13: Discretionary - Productive - Emacs2025-06-16 12:08 - 12:25: Personal - Routines2025-06-16 11:08 - 12:08: A+ - Childcare2025-06-16 10:00 - 11:08: Business - Earn - Consulting - E1 - General2025-06-16 09:36 - 10:00: A+ - Childcare2025-06-16 09:19 - 09:36: Discretionary - Productive - Music2025-06-16 08:37 - 09:19: Unpaid work - Cook2025-06-16 08:26 - 08:37: Discretionary - Productive - Gardening2025-06-16 07:26 - 08:26: A+ - Childcare2025-06-16 06:56 - 07:26: Personal - Routines2025-06-16 01:03 - 06:56: Sleep2025-06-15 23:14 - 01:03: Discretionary - Play - Stardew Valley2025-06-17 22:52 - 01:24: Discretionary - Play - Stardew Valley2025-06-17 22:50 - 22:52: Personal - Routines2025-06-17 21:23 - 22:50: A+ - Childcare2025-06-17 20:32 - 21:23: Personal - Routines2025-06-17 20:12 - 20:32: Unpaid work - Clean the kitchen2025-06-17 19:47 - 20:12: Unpaid work - Cook2025-06-17 13:15 - 19:47: A+ - Childcare2025-06-17 12:55 - 13:15: Unpaid work - Tidy up2025-06-17 12:49 - 12:55: Discretionary - Productive - Sewing2025-06-17 12:29 - 12:49: Personal - Routines2025-06-17 11:59 - 12:29: Discretionary - Productive - Emacs2025-06-17 11:02 - 11:59: A+ - Childcare2025-06-17 10:21 - 11:02: Discretionary - Productive - Emacs2025-06-17 09:37 - 10:21: Unpaid work - Tidy up2025-06-17 09:11 - 09:37: Discretionary - Productive - Gardening2025-06-17 09:00 - 09:11: Unpaid work - Clean the kitchen2025-06-17 08:46 - 09:00: Discretionary - Productive - Gardening2025-06-17 08:35 - 08:46: Personal - Routines2025-06-17 07:05 - 08:35: A+ - Childcare2025-06-17 06:57 - 07:05: Personal - Routines2025-06-17 01:08 - 06:57: Sleep2025-06-16 22:58 - 01:08: Discretionary - Play - Stardew Valley2025-06-18 23:01 - 01:08: Discretionary - Play - Stardew Valley2025-06-18 22:59 - 23:01: Personal - Routines2025-06-18 20:24 - 22:59: A+ - Childcare2025-06-18 19:54 - 20:24: Unpaid work - Cook2025-06-18 19:24 - 19:54: Personal - Routines2025-06-18 17:53 - 19:24: A+ - Childcare2025-06-18 16:23 - 17:53: Discretionary - Play - Stardew Valley2025-06-18 13:33 - 16:23: Discretionary - Productive - Sewing2025-06-18 13:11 - 13:33: Discretionary - Productive - Writing2025-06-18 13:08 - 13:11: Unpaid work - Clean the kitchen2025-06-18 12:59 - 13:08: Unpaid work - Clean the kitchen2025-06-18 11:59 - 12:59: Discretionary - Play - Stardew Valley2025-06-18 10:35 - 11:59: A+ - Childcare2025-06-18 10:05 - 10:35: Unpaid work - Errands2025-06-18 09:05 - 10:05: Discretionary - Productive - Emacs2025-06-18 08:22 - 09:05: Discretionary - Productive - Music2025-06-18 08:16 - 08:22: Discretionary - Productive - Gardening2025-06-18 06:56 - 08:16: Personal - Routines2025-06-18 01:24 - 06:56: Sleep2025-06-17 22:52 - 01:24: Discretionary - Play - Stardew Valley2025-06-19 23:00 - 00:14: Discretionary - Play - Stardew Valley2025-06-19 22:44 - 23:00: Personal - Routines2025-06-19 20:57 - 22:44: A+ - Childcare2025-06-19 20:36 - 20:57: Discretionary - Play - Stardew Valley2025-06-19 20:17 - 20:36: Discretionary - Productive - Bike Brigade2025-06-19 18:30 - 20:17: Discretionary - Play - Stardew Valley2025-06-19 18:00 - 18:30: Personal - Routines2025-06-19 17:56 - 18:00: Unpaid work - Clean the kitchen2025-06-19 11:00 - 17:56: A+ - Childcare2025-06-19 10:30 - 11:00: Discretionary - Productive - Bike Brigade2025-06-19 10:08 - 10:30: Unpaid work - Tidy up2025-06-19 09:58 - 10:08: Discretionary - Productive - Bike Brigade2025-06-19 09:58 - 09:58: Discretionary - Productive - Bike Brigade2025-06-19 09:48 - 09:58: A+ - Childcare2025-06-19 09:12 - 09:48: Discretionary - Productive - Bike Brigade2025-06-19 08:27 - 09:12: Discretionary - Productive - Music2025-06-19 08:21 - 08:27: Unpaid work - Clean the kitchen2025-06-19 06:56 - 08:21: Personal - Routines2025-06-19 01:08 - 06:56: Sleep2025-06-18 23:01 - 01:08: Discretionary - Play - Stardew Valley2025-06-20 22:06 - 00:24: Discretionary - Play - Stardew Valley2025-06-20 21:53 - 22:06: A+ - Childcare2025-06-20 21:21 - 21:53: Discretionary - Play - Stardew Valley2025-06-20 20:43 - 21:21: Discretionary - Productive - Bike Brigade2025-06-20 20:20 - 20:43: Personal - Routines2025-06-20 19:55 - 20:20: Discretionary - Play - Stardew Valley2025-06-20 16:33 - 19:55: Discretionary - Productive - Emacs2025-06-20 16:09 - 16:33: Discretionary - Productive - Gardening2025-06-20 15:04 - 16:09: Discretionary - Play - Stardew Valley2025-06-20 13:15 - 15:04: Discretionary - Productive - Writing2025-06-20 11:00 - 13:15: Discretionary - Productive - Bike Brigade2025-06-20 10:54 - 11:00: A+ - Childcare2025-06-20 10:35 - 10:54: Discretionary - Productive - Gardening2025-06-20 09:05 - 10:35: Discretionary - Play - Stardew Valley2025-06-20 07:03 - 09:05: Personal - Routines2025-06-20 00:14 - 07:03: Sleep2025-06-19 23:00 - 00:14: Discretionary - Play - Stardew Valley2025-06-21 23:46 - 01:10: Discretionary - Play - Stardew Valley2025-06-21 21:55 - 23:46: A+ - Childcare2025-06-21 21:25 - 21:55: Personal - Routines2025-06-21 20:38 - 21:25: Unpaid work - Clean the kitchen2025-06-21 19:36 - 20:38: Unpaid work - Cook2025-06-21 19:21 - 19:36: Unpaid work - Clean the kitchen2025-06-21 19:05 - 19:21: Personal - Routines2025-06-21 18:05 - 19:05: Unpaid work - Cook2025-06-21 17:35 - 18:05: Unpaid work - Cook2025-06-21 15:56 - 17:35: Discretionary - Play - Stardew Valley2025-06-21 14:40 - 15:56: Discretionary - Productive - Coding2025-06-21 14:33 - 14:40: Unpaid work - Clean the kitchen2025-06-21 14:30 - 14:33: Unpaid work - Clean the kitchen2025-06-21 12:55 - 14:30: Discretionary - Productive - Coding2025-06-21 12:20 - 12:55: Discretionary - Play - Stardew Valley2025-06-21 11:20 - 12:20: Discretionary - Productive - Emacs2025-06-21 11:07 - 11:20: Discretionary - Productive - Bike Brigade2025-06-21 10:42 - 11:07: Discretionary - Family2025-06-21 10:33 - 10:42: Business - Build - Paperwork2025-06-21 10:12 - 10:33: Discretionary - Productive - Bike Brigade2025-06-21 09:32 - 10:12: Discretionary - Productive - Gardening2025-06-21 09:08 - 09:32: Personal - Routines2025-06-21 08:27 - 09:08: Discretionary - Productive - Writing2025-06-21 06:55 - 08:27: Personal - Routines2025-06-21 00:38 - 06:55: Sleep2025-06-21 00:24 - 00:38: A+ - Childcare2025-06-20 22:06 - 00:24: Discretionary - Play - Stardew Valley2025-06-22 23:19 - 06:55: Sleep2025-06-22 23:07 - 23:19: Personal - Routines2025-06-22 21:07 - 23:07: A+ - Childcare2025-06-22 20:30 - 21:07: Personal - Routines2025-06-22 19:45 - 20:30: Discretionary - Play - Stardew Valley2025-06-22 19:38 - 19:45: Personal - Routines2025-06-22 19:28 - 19:38: Unpaid work - Clean the kitchen2025-06-22 16:10 - 19:28: Discretionary - Play - Stardew Valley2025-06-22 16:07 - 16:10: Personal - Routines2025-06-22 14:47 - 16:07: Discretionary - Play - Stardew Valley2025-06-22 14:45 - 14:47: Discretionary - Productive - Tracking2025-06-22 14:03 - 14:45: Personal - Routines2025-06-22 13:52 - 14:03: Discretionary - Play - Stardew Valley2025-06-22 13:20 - 13:52: Personal - Plan2025-06-22 13:20 - 13:20: Discretionary - Productive - Tracking2025-06-22 12:14 - 13:20: Discretionary - Productive - Coding2025-06-22 11:04 - 12:14: Personal - Routines2025-06-22 09:54 - 11:04: Discretionary - Productive - Bike Brigade2025-06-22 09:53 - 09:54: Discretionary - Productive - Music2025-06-22 09:13 - 09:53: Discretionary - Productive - Gardening2025-06-22 06:57 - 09:13: Personal - Routines2025-06-22 01:10 - 06:57: Sleep2025-06-21 23:46 - 01:10: Discretionary - Play - Stardew Valley2025-06-23 23:48 - 06:57: Sleep2025-06-23 23:38 - 23:48: Personal - Routines2025-06-23 22:36 - 23:38: Discretionary - Play - Stardew Valley2025-06-23 22:21 - 22:36: Personal - Routines2025-06-23 21:36 - 22:21: A+ - Childcare2025-06-23 20:51 - 21:36: Personal - Routines2025-06-23 20:22 - 20:51: Discretionary - Productive - Sewing2025-06-23 19:19 - 20:22: Personal - Routines2025-06-23 18:11 - 19:19: Discretionary - Play - Stardew Valley2025-06-23 18:11 - 18:11: Personal - Routines2025-06-23 17:38 - 18:11: Sleep2025-06-23 17:01 - 17:38: Personal - Routines2025-06-23 13:26 - 17:01: Sleep2025-06-23 13:23 - 13:26: A+ - Childcare2025-06-23 13:15 - 13:23: Sleep2025-06-23 12:06 - 13:15: Discretionary - Play - Stardew Valley2025-06-23 11:51 - 12:06: Unpaid work - Clean the kitchen2025-06-23 11:06 - 11:51: Personal - Routines2025-06-23 09:57 - 11:06: Discretionary - Productive - Emacs2025-06-23 09:25 - 09:57: Discretionary - Play - Stardew Valley2025-06-23 08:54 - 09:25: Discretionary - Productive - Music2025-06-23 08:40 - 08:54: Discretionary - Productive - Gardening2025-06-23 06:55 - 08:40: Personal - Routines2025-06-22 23:19 - 06:55: Sleep2025-06-24 22:57 - 01:04: Discretionary - Play - Stardew Valley2025-06-24 22:12 - 22:57: Personal - Routines2025-06-24 21:28 - 22:12: A+ - Childcare2025-06-24 21:24 - 21:28: A+ - Childcare2025-06-24 21:19 - 21:24: A+ - Childcare2025-06-24 21:05 - 21:19: Discretionary - Productive - Emacs2025-06-24 20:55 - 21:05: Discretionary - Productive - Music2025-06-24 20:17 - 20:55: Unpaid work - Cook2025-06-24 19:13 - 20:17: Personal - Routines2025-06-24 14:46 - 19:13: A+ - Childcare2025-06-24 14:26 - 14:46: Discretionary - Productive - Writing2025-06-24 14:17 - 14:26: Discretionary - Productive - Gardening2025-06-24 14:16 - 14:17: Discretionary - Productive - Writing2025-06-24 14:11 - 14:16: Discretionary - Productive - Gardening2025-06-24 14:10 - 14:11: Unpaid work - Clean the kitchen2025-06-24 13:53 - 14:10: Unpaid work - Tidy up2025-06-24 13:23 - 13:53: Discretionary - Play - Stardew Valley2025-06-24 12:55 - 13:23: Personal - Routines2025-06-24 11:55 - 12:55: Discretionary - Play - Stardew Valley2025-06-24 11:17 - 11:55: A+ - Childcare2025-06-24 10:17 - 11:17: Personal - Plan2025-06-24 09:58 - 10:17: Personal - Routines2025-06-24 09:43 - 09:58: A+ - Childcare2025-06-24 09:15 - 09:43: Personal - Plan2025-06-24 08:46 - 09:15: Unpaid work - Clean the kitchen2025-06-24 08:31 - 08:46: Unpaid work - Cook2025-06-24 08:12 - 08:31: Discretionary - Productive - Gardening2025-06-24 06:57 - 08:12: Personal - Routines2025-06-23 23:48 - 06:57: Sleep2025-06-25 23:01 - 01:19: Discretionary - Play - Stardew Valley2025-06-25 22:39 - 23:01: A+ - Childcare2025-06-25 21:51 - 22:39: Discretionary - Play - Stardew Valley2025-06-25 21:41 - 21:51: Personal - Routines2025-06-25 21:15 - 21:41: Discretionary - Play - Stardew Valley2025-06-25 20:47 - 21:15: Personal - Routines2025-06-25 20:33 - 20:47: Discretionary - Productive - Music2025-06-25 18:57 - 20:33: A+ - Childcare2025-06-25 18:42 - 18:57: Unpaid work - Clean the kitchen2025-06-25 18:06 - 18:42: Personal - Routines2025-06-25 15:07 - 18:06: A+ - Childcare2025-06-25 11:58 - 15:07: Discretionary - Productive - Emacs2025-06-25 10:58 - 11:58: A+ - Childcare2025-06-25 10:43 - 10:58: Discretionary - Play - Stardew Valley2025-06-25 10:07 - 10:43: Discretionary - Productive - Coding2025-06-25 09:52 - 10:07: Personal - Routines2025-06-25 09:04 - 09:52: Discretionary - Productive - Emacs2025-06-25 09:04 - 09:04: Discretionary - Productive - Emacs2025-06-25 09:01 - 09:04: Discretionary - Productive - Writing2025-06-25 08:59 - 09:01: Discretionary - Productive - Writing2025-06-25 08:25 - 08:59: Discretionary - Productive - Gardening2025-06-25 06:58 - 08:25: Personal - Routines2025-06-25 01:04 - 06:58: Sleep2025-06-24 22:57 - 01:04: Discretionary - Play - Stardew Valley2025-06-26 21:55 - 00:38: Discretionary - Play - Stardew Valley2025-06-26 21:24 - 21:55: A+ - Childcare2025-06-26 21:05 - 21:24: Personal - Routines2025-06-26 20:03 - 21:05: Discretionary - Play - Stardew Valley2025-06-26 19:44 - 20:03: Discretionary - Productive - Bike Brigade2025-06-26 19:27 - 19:44: Personal - Routines2025-06-26 19:17 - 19:27: Unpaid work - Clean the kitchen2025-06-26 19:00 - 19:17: Personal - Routines2025-06-26 18:30 - 19:00: Personal - Routines2025-06-26 14:56 - 18:30: Discretionary - Productive - Sewing2025-06-26 14:46 - 14:56: A+ - Childcare2025-06-26 13:48 - 14:46: Discretionary - Play - Stardew Valley2025-06-26 13:18 - 13:48: Discretionary - Productive - Writing2025-06-26 12:47 - 13:18: Personal - Routines2025-06-26 12:36 - 12:47: Discretionary - Productive - Writing2025-06-26 12:19 - 12:36: Unpaid work - Clean the kitchen2025-06-26 12:11 - 12:19: Discretionary - Play - Stardew Valley2025-06-26 09:35 - 12:11: A+ - Childcare2025-06-26 09:27 - 09:35: Discretionary - Productive - Emacs2025-06-26 08:42 - 09:27: Discretionary - Productive - Bike Brigade2025-06-26 06:57 - 08:42: Personal - Routines2025-06-26 01:22 - 06:57: Sleep2025-06-26 01:19 - 01:22: Personal - Routines2025-06-25 23:01 - 01:19: Discretionary - Play - Stardew Valley2025-06-27 22:19 - 00:34: Discretionary - Play - Stardew Valley2025-06-27 22:17 - 22:19: Personal - Routines2025-06-27 20:49 - 22:17: A+ - Childcare2025-06-27 20:19 - 20:49: Personal - Routines2025-06-27 19:55 - 20:19: Discretionary - Play - Stardew Valley2025-06-27 19:50 - 19:55: Personal - Routines2025-06-27 19:36 - 19:50: Unpaid work - Clean the kitchen2025-06-27 13:56 - 19:36: A+ - Childcare2025-06-27 12:56 - 13:56: Discretionary - Productive - Sewing2025-06-27 12:46 - 12:56: Personal - Routines2025-06-27 12:15 - 12:46: Discretionary - Productive - Gardening2025-06-27 12:13 - 12:15: Unpaid work - Clean the kitchen2025-06-27 12:13 - 12:13: Unpaid work - Clean the kitchen2025-06-27 11:58 - 12:13: Personal - Routines2025-06-27 11:13 - 11:58: A+ - Childcare2025-06-27 10:00 - 11:13: Discretionary - Productive - Writing2025-06-27 09:49 - 10:00: Personal - Routines2025-06-27 09:38 - 09:49: A+ - Childcare2025-06-27 09:33 - 09:38: Discretionary - Play - Stardew Valley2025-06-27 09:00 - 09:33: Personal - Routines2025-06-27 08:33 - 09:00: Discretionary - Productive - Music2025-06-27 08:03 - 08:33: Personal - Routines2025-06-27 07:33 - 08:03: A+ - Childcare2025-06-27 06:58 - 07:33: Personal - Routines2025-06-27 00:38 - 06:58: Sleep2025-06-26 21:55 - 00:38: Discretionary - Play - Stardew Valley2025-06-28 23:34 - 01:00: Discretionary - Play - Stardew Valley2025-06-28 23:27 - 23:34: Personal - Routines2025-06-28 22:08 - 23:27: A+ - Childcare2025-06-28 22:03 - 22:08: A+ - Childcare2025-06-28 21:45 - 22:03: Personal - Routines2025-06-28 21:15 - 21:45: Unpaid work - Clean the kitchen2025-06-28 20:34 - 21:15: Personal - Routines2025-06-28 18:35 - 20:34: Unpaid work - Cook2025-06-28 18:35 - 18:35: Personal - Routines2025-06-28 17:34 - 18:35: Unpaid work - Cook2025-06-28 16:14 - 17:34: A+ - Childcare2025-06-28 15:19 - 16:14: Discretionary - Productive - Sewing2025-06-28 14:49 - 15:19: Discretionary - Play - Stardew Valley2025-06-28 13:52 - 14:49: Unpaid work - Tidy up2025-06-28 12:16 - 13:52: Discretionary - Play - Stardew Valley2025-06-28 12:16 - 12:16: Discretionary - Productive - Drawing2025-06-28 11:20 - 12:16: Discretionary - Productive - Drawing2025-06-28 11:16 - 11:20: Personal - Routines2025-06-28 10:51 - 11:16: Discretionary - Productive - Music2025-06-28 10:17 - 10:51: Discretionary - Productive - Bike Brigade2025-06-28 09:17 - 10:17: Unpaid work - Errands2025-06-28 07:46 - 09:17: Personal - Routines2025-06-28 00:34 - 07:46: Sleep2025-06-27 22:19 - 00:34: Discretionary - Play - Stardew Valley2025-06-29 22:25 - 00:53: Discretionary - Play - Stardew Valley2025-06-29 22:19 - 22:25: Personal - Routines2025-06-29 21:19 - 22:19: A+ - Childcare2025-06-29 20:44 - 21:19: Discretionary - Productive - Sewing2025-06-29 20:14 - 20:44: Personal - Routines2025-06-29 19:44 - 20:14: Unpaid work - Clean the kitchen2025-06-29 19:17 - 19:44: Personal - Routines2025-06-29 18:57 - 19:17: Discretionary - Productive - Sewing2025-06-29 16:48 - 18:57: Discretionary - Play - Stardew Valley2025-06-29 16:20 - 16:48: Discretionary - Productive - Sewing2025-06-29 16:05 - 16:20: Unpaid work - Tidy up2025-06-29 15:32 - 16:05: Discretionary - Productive - Gardening2025-06-29 11:15 - 15:32: A+ - Childcare2025-06-29 10:55 - 11:15: Discretionary - Productive - Music2025-06-29 10:35 - 10:55: Discretionary - Productive - Gardening2025-06-29 09:26 - 10:35: Personal - Routines2025-06-29 01:00 - 09:26: Sleep2025-06-28 23:34 - 01:00: Discretionary - Play - Stardew Valley2025-06-30 22:18 - 00:42: Discretionary - Play - Stardew Valley2025-06-30 21:59 - 22:18: A+ - Childcare2025-06-30 21:46 - 21:59: Discretionary - Productive - Emacs2025-06-30 21:40 - 21:46: Unpaid work - Clean the kitchen2025-06-30 21:15 - 21:40: A+ - Childcare2025-06-30 21:08 - 21:15: Discretionary - Play - Stardew Valley2025-06-30 20:12 - 21:08: A+ - Childcare2025-06-30 20:08 - 20:12: Unpaid work - Clean the kitchen2025-06-30 19:19 - 20:08: Discretionary - Play - Stardew Valley2025-06-30 19:10 - 19:19: Unpaid work - Clean the kitchen2025-06-30 17:41 - 19:10: A+ - Childcare2025-06-30 16:43 - 17:41: Discretionary - Play - Stardew Valley2025-06-30 16:38 - 16:43: Business - Earn - Consulting - E1 - General2025-06-30 16:36 - 16:38: Personal - Routines2025-06-30 16:34 - 16:36: Business - Earn - Consulting - E1 - General2025-06-30 15:25 - 16:34: Discretionary - Productive - Emacs2025-06-30 15:24 - 15:25: Discretionary - Productive - Emacs2025-06-30 15:13 - 15:24: A+ - Childcare2025-06-30 15:07 - 15:13: Unpaid work - Laundry2025-06-30 14:49 - 15:07: Personal - Routines2025-06-30 10:43 - 14:49: A+ - Childcare2025-06-30 10:43 - 10:43: Discretionary - Productive - Gardening2025-06-30 10:28 - 10:43: Discretionary - Play - Read - Fiction2025-06-30 10:14 - 10:28: A+ - Childcare2025-06-30 10:03 - 10:14: A+ - Childcare2025-06-30 09:33 - 10:03: Discretionary - Productive - Sewing2025-06-30 09:18 - 09:33: Discretionary - Productive - Sewing2025-06-30 08:53 - 09:18: Discretionary - Productive - Music2025-06-30 08:14 - 08:53: Personal - Routines2025-06-30 07:48 - 08:14: Discretionary - Play - Stardew Valley2025-06-30 07:23 - 07:48: Personal - Routines2025-06-30 00:53 - 07:23: Sleep2025-06-29 22:25 - 00:53: Discretionary - Play - Stardew Valley
View org source for this post

2025-06-30 Emacs news

| emacs, emacs-news

Links from reddit.com/r/emacs, r/orgmode, r/spacemacs, r/planetemacs, 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

2025-06-23 Emacs news

Posted: - Modified: | emacs, emacs-news

[2025-06-25 Wed]: Removed reposted video.

Links from reddit.com/r/emacs, r/orgmode, r/spacemacs, r/planetemacs, 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

The wobble is not the obstacle, it's the way

| life, parenting
2025-06-10 catastrophizing.jpg

9 PM on a schoolday, time for me to nudge A+ off to bed. A+ is clicking through the Stardew Valley wiki, slurping up all sorts of trivia that she'll probably trickle into our conversations. There are two pieces of homework left to do, one with quite a few slides to complete. And drawing. She's not a big fan of drawing assignments. "My hand is tired," she says.

I try to be calm and supportive. I wobble. Could've done this earlier, I think. I manage to keep myself from saying it. I teeter, noticing myself mentally fast-forwarding decades ahead. Oh no, she's not going to get the hang of doing things that she finds boring, she won't develop study skills or executive control, she'll cram through all the classes she can coast in, and all of it will come crashing down in university when she might actually need to buckle down and study.

She's 9! She's a long way from university.

I'm learning to embrace my anxiety and appreciate how it tries to keep us all safe. This feeling makes sense. I want to help her avoid mistakes, especially when the feedback cycle is long and the results of choices will only be seen much later.

But anxiety gets in the way of parenting. If I let the fearful part of my brain take over, I'll inadvertently teach her that mistakes are catastrophic rather than just ordinary Tuesdays. I want to hold her steady, but the wobbles are how we learn.

It's somewhat manageable now, when we can talk about these things openly. A+ can laugh off my worries ("Mom, you're fretting again,") and W- can remind me to slow down when it runs away with me. He's usually pretty chill about all this. It'll be harder when the cognitive rewiring of puberty or menopause turn ordinary conversations into minefields right when the stakes get higher. The more I tighten my grip, the more star systems will slip through my fingers. (There I go again with catastrophizing.)

Besides, I want to help A+ avoid the paralysis of perfectionism or self-recrimination. I want her to be able to experiment, and to pick herself up and try again if things don't work out the first time around. To do that, I need to learn to change my perspective from being anxious about mistakes to seeing the opportunities for re-takes.

There are many things I can't teach A+. Some things can't fully be taught, they can only be learned, like how to balance the clay on the pottery wheel. Sometimes I don't even know what the right answer would be, like what kinds of tips work for her particular brain. Some things change over time and she'll need to change with them, like how to adapt to life's situations. She'll need to learn how to learn instead of relying on one fixed answer.

2025-06-10 loops.jpg

Fortunately, life comes with so many opportunities to practise. The Toronto public school calendar has 187 instructional days, so she gets plenty of chances to manage her homework and get feedback. The repetitive nature of things used to frustrate me when it came to my tasks (always more dishes to wash, always more clothes to fold), but it's good for learning, especially while the stakes are low. It's her experiment, I remind myself. About half the time, she doesn't even want my help. ("I can do it, Mom.") She's sensible enough to try things out on small experiments instead of scary ones: shopping at the grocery store on her own, not skydiving.

There's plenty of stuff for me to learn while she learns. When I get the urge to correct her work ("How does that line up with the rubric?") or nag her to get her work done, I tell myself:

  • Is it really a problem? The teacher isn't expecting her to completely master all the skills, and the teacher is in a good place to give developmentally-appropriate feedback. I can let her experiment with how much work she wants to put into things, and she can see what that results in. Despite all my twitchiness about how she puts off her daily homework until 9 PM, she still manages to get things done. Judging from the frequent reminders her teacher gives the virtual class, she's probably ahead of the curve. So maybe it's not a problem.
  • Whose problem is it? Something might not be my problem. It might not even be her problem. She reads during class time, for instance. Sometimes she misses something that can't be figured out from just the homework slide deck. Maybe that's partly her experimenting to find the right balance between attention and stimulation. Maybe that's also partly a consequence of how school is designed to go at the group's pace. Not entirely her problem.

The more I let go of the small stuff, the more experience she'll be able to draw on for the big stuff. I hope she'll get the hang of thinking of life as mostly series of little experiments, and to notice when there's a bigger choice that needs more thinking because it's more long-term. The more she decides, the more confidence we both develop in her decisions.

This reminds me of how kids learn how to bike. The popular approach uses training wheels to prevent falls. The idea is to gradually raise them as the kid improves, but I usually see kids pedaling along (perhaps slightly leaning over to one side) to match the slowness of parents' walking. It's hard to balance when you're going slow. But pedaling isn't the hard part. Balancing is, and you develop balance by balancing. Maybe that's a little like how I get tempted to rescue A+ from the results of some of her choices, but letting her try things is how to help her learn.

2025-06-10 balance bike.jpg

A+ learned how to bike using a balance bike instead of using training wheels. When she was two, she toddled along on a Strider, which was light enough for her to manage. Eventually she figured out coasting. She was proud of being able to do it on her own. Then we upgraded her to a Cleary Gecko freewheel bike, with proper hand-brakes and everything. After a few attempts with us holding her under her armpits, she was ready for us to steady her with a hand on her back, and then for us to be close, and then she was off on her own. She fell and skinned her knee many times, developing an appreciation of pants for protection and ice cream for comfort. The more she biked, the more she learned how to notice that feeling of being slightly off-balance, and the better she got at correcting it. Now we can bike on the streets together.

You can't learn how to bike if the training wheels are always on, or if someone's always holding you steady. It's okay to wobble and fall and get up. You learn that you can survive a skinned knee, and so you keep going.

Sometimes, when A+'s in the middle of a meltdown, I have to remind myself not to try to fix it in the moment. That doesn't work, anyway. Just take the loss and try again next time. Sometimes, once we've both calmed down, I ask A+ to imagine rewinding back to a situation so we can play it out a little differently. Sorry, I meant to say this, not that. Would that work better? Next time.

Not mistakes. Data. Just another step in the journey.

conscientiousness-piano.jpg

Getting better at getting better helps me, too. I've been practising piano, making steady progress through the Simply Piano app. I've been playing for about four months now. I took piano lessons as a kid, but not to any serious extent. Back then, I got bored with the simple exercises I had to do. Now I feel slow, snail-slow, but I can savour the way my mind is beginning to get the hang of things, knowing that it will take me many tries to get the hang of it. I'm starting to be able to look at the notes and remember the phrases, imagine what the next sequence will sound like before I play it, and notice how my hands move to make it happen.

When my fingers wobble on the keys, I slow down and try again. There's no point in berating myself. If my mind keeps hiccuping or my fingers keep stumbling, I can think: ah, is this because I'm tired, or because I want to do something else, or just because I'm learning and it takes time to get the hang of things? I'm getting better at figuring out when I should probably call it a day so that I don't practise mistakes into my muscle memory and when I might benefit from just slowing down the segment.

I still stumble through pieces I've successfully played before. Remembering is hard. But I'm getting better at being patient with myself, accepting that it's because I'm still in the middle of the journey. It's not a mistake that I should grump at myself about. It's just part of a re-take. This is what learning looks (and sounds) like. Of course it doesn't start out perfectly smooth.

Here's me learning Mozart's "Rondo alla Turca", with the app providing accompaniment in the background. It's not perfect, but it's progress.

・・・・・

We were at the playground. I ate the remaining crackers in the snack box because I thought A+ was done. Turns out she was saving them for later. She was very upset. I apologized and promised to ask next time, but she was too far gone to hear.

That was a tough moment. A+ was already emotionally off-balance because the playdate hadn't gone as well as it usually does. Discovering I had eaten the crackers she was looking forward to was the last straw. She dissolved into tears. I snuggled her and settled in for a long wait. I think: Where's the line between comforting her and coddling her? Does my anxiety teach her this is too hard to handle? We're not quite at the point of being able to shrug off mistakes. I remind myself that she'll learn what she's ready to learn.

Looking around while A+ drenched my left shoulder, I noticed a skateboarder on the park road. Maybe a man in his thirties? He was trying to jump his skateboard over a low concrete lane divider. He had been at it for a while before I noticed. Most times, he was able to clear the divider, but the skateboard slowed down too much on the other side and he had to jump off. On the seventh try that I saw, he landed back on the skateboard and rolled on for a bit. Success! He tried again and failed. Four more failures before his next success. One more attempt–another failure–and then he called it a day. I'm sure he'll be back at it.

A+ continued to cry. My phone buzzed, reminding me that we probably wanted to get going before the rain in the forecast. I carried her as I picked up our bags and put them in my bike. Eventually I needed to gradually ease her off me. She curled up in the bucket of my front-loader cargo bike, still crying. I tucked the towel around her like a blanket, buckled her bike into the tow-bag, and walked the bikes home. She fell asleep.

A wobble, a fall. But I'm sure we'll be back at it too. (And we did; the next day, she was happily playing with her friends again.)

・・・・・

It's hard to be in the moment. Sometimes the moment sucks. It's hard to be far ahead in the future. It makes decisions feel too big. Do-overs make things just the right size. If we can get good at shrugging off the inevitable failures and treating them as data so that we can sketch out ideas for the next experiment, I think that'd be pretty cool. Instead of "Oh no!" or even "Are you sure about that?" (what kid likes to be doubted?), I can lean towards, "Hmm, let's find out."

As predicted, we had another late-night homework situation. This time she had a headache and wanted to go to bed, homework unfinished. I was able to let go and just focus on snuggling her in. The next day, after morning routines and without any nagging, she did the homework and submitted it. Late, but done.

There'll be another bedtime homework session, I'm sure. I have to trust that even though I want to shortcut the learning for her, she's got this. She's figuring things out. If we stumble, that just helps us practice for next time, and there are so many opportunities to try again. The wobble is not the obstacle, it's the way.1

This post is yet another take on the June IndieWeb Carnival theme of Take Two. Here are two other ones: Making and re-making: fabric is tuition and Thinking about time travel with the Emacs text editor, Org Mode, and backups.

Related reflections:

Footnotes

1

Related: The Obstacle is the Way, Ryan Holiday's book on Stoicism; the title rephrases this thought from Marcus Aurelius's Meditations: "… and that which is an obstacle on the road helps us on this road."

View org source for this post

Thinking about time travel with the Emacs text editor, Org Mode, and backups

| emacs, org

Sometimes I just need to rewind 15 minutes. That's the length of A+'s recess at virtual school, which she does at home. At recess, she often likes to get hugs and sometimes a snack. If I'm working on something that requires sustained thought, like code or a blog post, I can't hold those thoughts in my head for that long while cheerfully listening to A+ share the trivia she's read on the Stardew Valley wiki. If I try to keep my train of thought, I get grumpy. I'd rather get better at time travel instead. Naturally, this calls for Emacs.

For people who are unfamiliar with Emacs or Org Mode

GNU Emacs is a highly customizable program for editing text, writing code, and doing mostly whatever people want to get it to do. Org Mode is a package (or ecosystem of packages, really) that modifies GNU Emacs to make it easier to take notes, plan tasks, export documents, and so on. If you're not into Emacs yet, this post might be a little technical, but maybe there are ways to translate some of the ideas to things you're using.

What was I doing again?

Sometimes recess totally resets my brain and I can't even think of what I was just working on. To make it easier to hit the ground running, I try to make a habit of creating a task in Org Mode before I start working on it. Or, more realistically, halfway through, when I realize I have to first do another thing, so then I jot down a quick task for the work I was previously doing and another task for the tangent I'm about to go on. That way, I can quickly check my notes to see what I was doing. org-capture (which I've bound to C-c r) is handy for that. I have a template (t) that creates a timestamped TODO that links to the context I created it in (files, note headings, etc.) and saves it to my inbox file. Then I can jump to my inbox file with a keyboard shortcut and look at what I need to get back to doing.

Sometimes I vaguely remember that I've already created a task for this before and I can find it with C-u C-c C-w (org-refile). When org-refile is called with a universal prefix argument (C-u), it will prompt for a heading in org-refile-targets and jump to it. I have it set to complete the outline path, so I can try to find things by project. Failing that, I might have a quick rummage in my inbox. I usually don't remember the exact words I used in the the task title, though. Maybe someday I'll get the hang of org-ql or p-search (Emacsconf talk on p-search), resurrect the Remembrance Agent so that it can continuously do bag-of-words matching, or use embeddings to find semantically similar tasks and notes. In the meantime, capturing the task is more important than avoiding duplicates. I can find and clean up duplicates later on.

All of that is moot when I'm away from my computer, which is most of the time. My phone is pretty handy for quick notes, though. I use Orgzly Revived to capture a quick note in my inbox. This gets synchronized with my Org Mode notes using Syncthing.

Hmm, I gotta do this first…

Often the interruption doesn't even come from outside, but from my brain's endless stream of interesting ideas. Some of those ideas can be saved as tasks to work on eventually, but sometimes I need to pause my current task and work on the new idea. I have a template for an interrupting task (i) that automatically clocks out of the previous task and clocks into the new one.

My template for interrupting tasks

This is the entry in my org-capture-templates.

        ("i" "Interrupting task" entry
         (file ,my-org-inbox-file)
         "* STARTED %^{Task}\n:PROPERTIES:\n:CREATED: %U\n:END:\n%a\n"
         :clock-in :clock-resume
         :prepend t)

Okay, that's done, what was I doing before?

If I clock into tasks, I can use org-clock-goto along with the C-u universal prefix (C-u C-c C-x C-j) to see a list of recently-clocked-in tasks. This is great for "popping the stack," which is how I think of backtracking once I finished an interrupting task.

I usually forget to clock out. That's okay. I'm not looking for precise total times, just breadcrumbs.

… What was I thinking?

Sometimes a few keywords aren't enough to jog my memory. Whenever I think, "Ah, this is easy, I don't need to take notes," I inevitably regret it. Sometimes I realize I have to re-do my thinking fifteen minutes later, when singing 4-Town songs with A+ has pushed those thoughts out of my brain. Sometimes I have to re-do my thinking several months later, which is even harder.

Notes are super-helpful. I love the way Org Mode lets me write notes, paste in hyperlinks, add snippets of code, save the results of my explorations, include my sketches, and even export them as blog posts or documents to share.

Sometimes I have to go back farther into the past

It can take me months or even years before I can circle back to a project or idea. It can be hard to reconstruct my thinking after a lot of time has passed, so it's good to write down as much as possible. Taking notes feels slower than just plunging ahead, but they help me travel back in time to try to remember.

This really gets hammered in when I run into things I've forgotten, like when I dusted off my time-tracking code so I could make some changes. In the four years that elapsed between Aug 2020 (my last change) and Oct 2024 (when I decided to upgrade it to the latest version of Rails), I'd forgotten how to even run a development version of my code. Whoops. I ended up taking more notes along the way.

I try to keep project-related notes as close to the project files as possible, like a README.org in the project directory. Sometimes I don't even remember what the project is called. I try to keep another file that indexes things on my computer as well as things in real life.

Sometimes I know I wrote tasks or notes down before but I can't remember the exact words I used for them. I'm curious about whether embeddings might help me find those things again. So far it's been okay to just add a new task or note, and then periodically clean up entries that are no longer needed.

Going sideways

Sometimes I want to visit alternate timelines, trying different ways to do something. I really like the way undo works in Emacs. It's different from most programs. Emacs keeps the things you undo/redo.

Let's say I start writing a paragraph or a piece of code. I change my mind about something. Maybe I undo, maybe I cut, maybe I delete. I write again. I change my mind again. The first way was better, maybe. I can go back to that, step through any of the intermediate changes, consider the other version again. It's not lost.

Actually navigating the Emacs undo history can be tricky. I like using the vundo package for that. It shows a compact view of the different branches of this timeline so that I can easily jump between them or compare them.

[2025-06-26 Thu] Check out Undo finally clicked with vundo | shom.dev for a screenshot and some explanation of vundo.

If I'm working on something more complicated, like code, I might make changes over several sessions. This is where version control is handy. I like using the Git version control system, especially with the Magit package. I can commit versions of the files manually along with a quick note about what I changed or what I'm trying. This allows me to easily reset to a certain point.

Sometimes I'm good about picking the right point to commit: I've made decent progress and things are working. Sometimes I realize only later on that I probably should have saved a commit a little while ago, and now I'm halfway through another idea that I'm not going to have time to finish and that leaves my project in a non-working state. In that situation, sometimes I'll use the visual undo provided by the vundo package to go backwards to a version that looks about right, save that file, commit it with a quick note, and then go forward in time again.

Saving revisions in Git makes it much easier to go backwards in time even if I've restarted my computer. magit-blame and vc-annotate give me slightly different views showing me the changes in a file. They don't show me information on deleted sections, though. For that, I can use the magit-diff command to compare versions. Sometimes it's easier to flip through the history of a single file with git-timemachine.

Git lets me name different experimental timelines (branches) and logically group changes together. It means I don't have to worry so much about messing up a working file, since I can travel back in time to that version. It also means I can easily compare them to see what I've changed so far.

In addition to using version control for various projects, I also save backup files to a separate directory by setting my backup-directory-alist to (("." . "~/.config/emacs/backups")). Disk space is cheap; might as well keep all the backups. I sometimes manually go into this directory to find older versions of things. It occurs to me that it might be good to flip through the backups in the same way that git-time-machine makes it easy to flip through git revisions. I'm trying out lewang/backup-walker, which shows the incremental diffs between versions. It was last updated 12 years ago(!), but can easily be dusted off to work with Emacs 30 by defining some functions that it's looking for. Here's my config snippet:

(use-package backup-walker
  :vc (:url "https://github.com/lewang/backup-walker")
  :init
  (defalias 'string-to-int 'string-to-number)
  (defalias 'display-buffer-other-window 'display-buffer))

Into the future

It's not all about going back to the past. Sometimes I want to plan ahead: tasks that I want to schedule for a certain date, pre-mortems to help me make decisions, gifts for my future self. I use Google Calendar for appointments and other things I might want to share with W- for planning, but there are lots of other things that aren't tied to a specific time and date. The agenda feature of Org Mode is handy for scheduling things and moving them around.

Scheduled tasks don't work out so well if my agenda gets cluttered by things I ignore, so if I find myself procrastinating something a lot, I think about whether I really want to do whatever it is I've written down.

Some notes aren't associated with specific dates, but with other events that might happen. I have an Org Mode outline with various subheadings under "In case of…", although I often forget to check these or have a hard time finding them again. Maybe someday I can write a script that analyzes the words I use in my journal entries or tasks and finds the notes that approximately match those keywords.

Things I want to try

Thinking out loud more might be worth experimenting with, since I can do that while I'm working in a different file. I've used my audio recorder to record braindumps and I have a workflow for transcribing those with OpenAI Whisper. I think it would be even more useful to have an org-capture equivalent so that I can capture the thought by audio, save the recording in case there are recognition errors (highly likely because of the technical terms), and save the context. Or maybe an even neater interface that keeps an ear out for keywords, executes commands based on them, and saves the rest as notes? whisper-ctranslate2 has a live_transcribe option that works reasonably well after a short delay, and maybe I can use a process filter to pull the information out or write a custom Python script.

I appreciate how working with plain text can help me jump backward or forward in time. I'm looking forward to seeing how this can be even better!

This post was inspired by Emacs Carnival 2025-06: Take Two • Christian Tietze and IndieWeb Carnival: Take Two. Check those out for related blog posts!

This is, in fact, my second take on the topic. =) Here's my first one: Making and re-making: fabric is tuition

View org source for this post

Transforming HTML clipboard contents with Emacs to smooth out Mailchimp annoyances: dates, images, comments, colours

| emacs

I've recently started handling the Bike Brigade newsletter, so now I'm itching to solve the little bits of friction that get in my way when I work with the rich-text Mailchimp block editor.

I'm not quite ready to generate everything with Org Mode. Sometimes other people go in and edit the newsletter through the web interface, so I shouldn't just dump a bunch of HTML in. (We don't have the more expensive plan that would allow me to make editable templates.) I draft the newsletter as a Slack canvas so more people can weigh in with their suggestions:

2025-06-20_20-58-49.png
Figure 1: Screenshot of Slack canvas

And then I redo it in Mailchimp:

2025-06-20_21-01-08.png
Figure 2: Screenshot of Mailchimp design

My process is roughly:

  1. Duplicate blocks.
  2. Copy the text for each item and paste it in. Adjust formatting.
  3. Update the dates and links. Flip back and forth between the dispatch webpage and Mailchimp, getting the links and the dates just right.
  4. Download images one by one.
  5. Replace the images by uploading the saved images. Hunt through lots of files named image (3).png, image (4).png, and so on. Update their attributes and links.
  6. Change text and link colours as needed by manually selecting the text, clicking on the colour button in the toolbar, and selecting the correct colour.
  7. Change the text on each button. Switch to Slack, copy the link, switch back to Mailchimp, and update the link.

I think I can get Emacs to make things easier.

Automating buttons

The newsletter includes a button to make it easier to volunteer for deliveries. In case people want to plan ahead, I also include a link to the following week's signups.

Dates are fiddly and error-prone, so I want to automate them. I can use a Mailchimp code block to paste in some HTML directly, since I don't think other people will need to edit this button. Here I take advantage of org-read-date's clever date parsing so that I can specify dates like +2Sun to mean two Sundays from now. That way, I don't have to do any date calculations myself.

This code generates something like this:

2025-06-20_21-09-44.png
Figure 3: Screenshot of buttons
Text from the screenshot

SIGN UP NOW TO DELIVER JUN 23-29
You can also sign up early to deliver Jun 30-Jul 6

Here's the code. It calculates the dates, formats the HTML code. I use format-time-string to format just the month part of the dates and compare them to tell if I can skip the month part of the end date. After the HTML is formatted, the code uses xdotool (a Linux command-line tool) to switch to Google Chrome so that I can paste it in.

(defun my-brigade-copy-signup-block ()
  (interactive)
  (let* ((newsletter-date (org-read-date nil nil "+Sun"))
         (current-week (org-read-date nil t "+Mon"))
         (current-week-end (org-read-date nil t "+2Sun"))
         (next-week (org-read-date nil t "+2Mon"))
         (next-week-end (org-read-date nil t "+3Sun")))
    (kill-new
     (format
      "<div style=\"background-color: #223f4d; text-align: center; max-width: 384px; margin: auto; margin-bottom: 12px;\"><a href=\"https://dispatch.bikebrigade.ca/campaigns/signup?current_week=%s\" target=\"_blank\" class=\"mceButtonLink\" style=\"background-color:#223f4d;border-radius:0;border:2px solid #223f4d;color:#ffffff;display:block;font-family:'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif;font-size:16px;font-weight:normal;font-style:normal;padding:16px 28px;text-decoration:none;text-align:center;direction:ltr;letter-spacing:0px\" rel=\"noreferrer\">SIGN UP NOW TO DELIVER %s-%s</a>
</div>
<p style=\"text-align: center; font-family: 'Helvetica Neue', Helvetica, Arial, Verdana\"><a href=\"https://dispatch.bikebrigade.ca/campaigns/signup?current_week=%s\" style=\"color: #476584; margin-top: 12px; margin-bottom: 12px;\" target=\"_blank\">You can also sign up early to deliver %s-%s</a></p>"
      (format-time-string "%Y-%m-%d" current-week)
      (upcase (format-time-string "%b %e" current-week))
      (format-time-string
       (if (string= (format-time-string "%m" current-week)
                    (format-time-string "%m" current-week-end))
           "%-e"
         "%b %-e")
       current-week-end)
      (format-time-string "%Y-%m-%d" next-week)
      (format-time-string "%b %e" next-week)
      (format-time-string
       (if (string= (format-time-string "%m" next-week)
                    (format-time-string "%m" next-week-end))
           "%-e"
         "%b %-e")
       next-week-end)))
    (shell-command "xdotool search  --onlyvisible --all Chrome windowactivate windowfocus")))

Now I can use an Org Mode link like elisp:my-brigade-copy-signup-block to generate the HTML code that I can paste into a Mailchimp code block. The button link is underlined even though the inline style says text-decoration:none, but it's easy enough to remove that with Ctrl+u.

Transforming HTML

The rest of the newsletter is less straightforward. I copy parts of the newsletter draft from the canvas in Slack to the block editor in Mailchimp. When I paste it in, I need to do a lot to format the results neatly.

I think I'll want to use this technique of transforming HTML data on the clipboard again in the future, so let's start with a general way to do it. This uses the xclip tool for command-line copying and pasting in X11 environments. It parses the HTML into a document object model (DOM), runs it through various functions sequentially, and copies the transformed results. Using DOMs instead of regular expressions means that it's easier to handle nested elements.

(defvar my-transform-html-clipboard-functions nil "List of functions to call with the clipboard contents.
Each function should take a DOM node and return the resulting DOM node.")
(defun my-transform-html-clipboard (&optional activate-app-afterwards functions text)
  "Parse clipboard contents and transform it.
This calls FUNCTIONS, defaulting to `my-transform-html-clipboard-functions'.
If ACTIVATE-APP-AFTERWARDS is non-nil, use xdotool to try to activate that app's window."
  (with-temp-buffer
    (let ((text (or text (shell-command-to-string "unbuffer -p xclip -o -selection clipboard -t text/html 2>& /dev/null"))))
      (if (string= text "")
          (error "Clipboard does not contain HTML.")
        (insert (concat "<div>"
                        text
                        "</div>"))))
    (let ((dom (libxml-parse-html-region (point-min) (point-max))))
      (erase-buffer)
      (dom-print (seq-reduce
                  (lambda (prev val)
                    (funcall val prev))
                  (or functions my-transform-html-clipboard-functions)
                  dom)))
    (shell-command-on-region
     (point-min) (point-max)
     "xclip -i -selection clipboard -t text/html -filter 2>& /dev/null"))
    (when activate-app-afterwards
      (call-process "xdotool" nil nil nil "search" "--onlyvisible" "--all" activate-app-afterwards "windowactivate" "windowfocus")))

Saving images

Images from Slack don't transfer cleanly to Mailchimp. I can download images from Slack one at a time, but Slack saves them with generic filenames like image (2).png. Each main newsletter item has one image, so I'd like to automatically save the image using the item title.

When I copy HTML from the Slack canvas, images are included as data URIs. The markup looks like this: <img src='data:image/png;base64,iVBORw0KGgo... With the way I do the draft in Slack, images are always followed by the item title as an h2 heading. If there isn't a heading, the image just doesn't get saved. If there's no image in a section, the code clears the variable, so that's fine too. I can parse and save the images like this:

(defun my-transform-html-save-images (dom dir &optional file-prefix transform-fn)
  (let (last-image)
    (dom-search dom
                (lambda (node)
                  (pcase (dom-tag node)
                    ('img
                     (let ((data (dom-attr node 'src)))
                       (with-temp-buffer
                         (insert data)
                         (goto-char (point-min))
                         (when (looking-at "data:image/\\([^;]+?\\);base64,")
                           (setq last-image (cons (match-string 1)
                                                  (buffer-substring (match-end 0) (point-max))))))))
                    ('h2
                     (when last-image
                       (with-temp-file
                           (expand-file-name
                            (format "%s%s.%s"
                                    (or file-prefix "")
                                    (if transform-fn
                                        (funcall transform-fn (dom-texts node))
                                      (dom-texts node))
                                    (car last-image))
                            dir)
                         (set-buffer-file-coding-system 'binary)
                         (insert (base64-decode-string (cdr last-image)))))
                     (setq last-image nil)))))
    dom))

I wrapped this in a small function for newsletter-specific processing:

(defvar my-brigade-newsletter-images-directory "~/proj/bike-brigade/newsletter/images")
(defun my-brigade-save-newsletter-images (dom)
  (my-transform-html-save-images
   dom
   my-brigade-newsletter-images-directory
   (concat (org-read-date nil nil "+Sun")
           "-news-")
   (lambda (heading)
     (replace-regexp-in-string
      "[^-a-z0-9]" ""
      (replace-regexp-in-string
       " +"
       "-"
       (string-trim (downcase heading)))))))

For easier testing, I used xclip -o -selection clipboard -t text/html > ~/Downloads/test.html to save the clipboard. To run the code with the saved clipboard, I can call it like this:

(my-transform-html-clipboard
 nil
 '(my-brigade-save-newsletter-images)
 (with-temp-buffer (insert-file-contents "~/Downloads/test.html") (buffer-string)))

Cleaning up

Now that I've saved the images, I can remove them:

(defun my-transform-html-remove-images (dom)
  (dolist (img (dom-by-tag dom 'img))
    (dom-remove-node dom img))
  dom)

I can also remove the italics that I use for comments.

(defun my-transform-html-remove-italics (dom)
  (dolist (node (dom-by-tag dom 'i))
    (dom-remove-node dom node))
  dom)

Here's how I can test it:

(my-transform-html-clipboard
 nil
 '(my-brigade-save-newsletter-images
   my-transform-html-remove-images
   my-transform-html-remove-italics)
 (with-temp-buffer (insert-file-contents "~/Downloads/test.html") (buffer-string)))

Removing sections

I put longer comments and instructions under "Meta" headings, which I can automatically remove.

(defvar my-brigade-section nil)
(defun my-brigade-remove-meta-recursively (node &optional recursing)
  "Remove <h1>Meta</h1> headings in NODE and the elements that follow them.
Resume at the next h1 heading."
  (unless recursing (setq my-brigade-section nil))
  (cond
   ((eq (dom-tag node) 'h1)
    (setq my-brigade-section (string-trim (dom-texts node)))
    (if (string= my-brigade-section "Meta")
        nil
      node))
   ((string= my-brigade-section "Meta")
    nil)
   (t
    (let ((processed
           (seq-keep
            (lambda (child)
              (if (stringp child)
                  (unless (string= my-brigade-section "Meta")
                    child)
                (my-brigade-remove-meta-recursively child t)))
            (dom-children node))))
      `(,(dom-tag node) ,(dom-attributes node) ,@processed)))))

Let's try it out:

(my-transform-html-clipboard
 nil
 '(my-brigade-save-newsletter-images
   my-transform-html-remove-images
   my-transform-html-remove-italics
   my-brigade-remove-meta-recursively)
 (with-temp-buffer (insert-file-contents "~/Downloads/test.html") (buffer-string)))

Formatting calls to action

Mailchimp recommends using buttons for calls to action so that they're larger and easier to click than links. In my Slack canvas draft, I use [ link text ] to indicate those calls to action. Wouldn't it be nice if my code automatically transformed those into centered buttons?

(defun my-brigade-format-buttons (dom)
  (dolist (node (dom-by-tag dom 'a))
    (let ((text (dom-texts node)))
      (if (string-match "\\[ *\\(.+?\\) *\\]" text)
          ;; button, wrap in a table
          (with-temp-buffer
            (insert
             (format "<table align=\"center\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\" role=\"presentation\" data-block-id=\"627\" class=\"mceButtonContainer\" style=\"margin: auto; text-align: center\"><tbody><tr class=\"mceStandardButton\"><td style=\"background-color:#000000;border-radius:0;text-align:center\" valign=\"top\" class=\"mceButton\"><a href=\"%s\" target=\"_blank\" class=\"mceButtonLink\" style=\"background-color:#000000;border-radius:0;border:2px solid #000000;color:#ffffff;display:block;font-family:'Helvetica Neue', Helvetica, Arial, Verdana, sans-serif;font-size:16px;font-weight:normal;font-style:normal;padding:16px 28px;text-decoration:none;text-align:center;direction:ltr;letter-spacing:0px\" rel=\"noreferrer\">%s</a></td></tr></tbody></table>"
                     (dom-attr node 'href)
                     (match-string 1 text)))
            (dom-add-child-before
             (dom-parent dom node)
             (car (dom-by-tag (libxml-parse-html-region (point-min) (point-max)) 'table)) node)
            (dom-remove-node dom node)))))
  dom)

Now I can test those functions in combination:

(my-transform-html-clipboard
 nil
 '(my-brigade-save-newsletter-images
   my-transform-html-remove-images
   my-transform-html-remove-italics
   my-brigade-remove-meta-recursively
   my-brigade-format-buttons)
 (with-temp-buffer (insert-file-contents "~/Downloads/test.html") (buffer-string)))
2025-06-20_21-10-38.png
Figure 4: Screenshot of button

Wrapping it up

Now that I've made all those little pieces, I can put them together in two interactive functions. The first function will be for the regular colour scheme, and the second function will be for the light-on-dark colour scheme. For convenience, I'll have it activate Google Chrome afterwards so that I can paste the results into the right block.

(defun my-brigade-transform-html (&optional recolor file)
  (interactive (list (when current-prefix-arg (read-file-name "File: "))))
  (my-transform-html-clipboard
  "Chrome"
  (append
   '(my-brigade-save-newsletter-images
     my-transform-html-remove-images
     my-transform-html-remove-italics
     my-brigade-remove-meta-recursively
     my-brigade-format-buttons)
   (if recolor '(my-brigade-recolor-recursively)))
  (when file
    (with-temp-buffer (insert-file-contents file) (buffer-string)))))

(defun my-brigade-transform-community-html (&optional file)
  (interactive (list (when current-prefix-arg (read-file-name "File: "))))
  (my-brigade-transform-html t file))

And then I can use links like this for quick shortcuts:

  • [[elisp:(my-brigade-transform-html nil "~/Downloads/test.html")]]
  • [[elisp:(my-brigade-transform-community-html "~/Downloads/test.html")]]
  • [[elisp:(my-brigade-transform-html)]]

Since this pastes the results as formatted text, it's editable using the usual Mailchimp workflow. That way, other people can make last-minute updates.

With embedded images, the saved HTML is about 8 MB. The code makes quick work of it. This saves about 10-15 minutes per newsletter, so the time investment probably won't directly pay off. But it also reduces annoyance, which is even more important than raw time savings. I enjoyed figuring all this out. I think this technique of transforming HTML in the clipboard will come in handy. By writing the functions as small, composable parts, I can change how I want to transform the clipboard.

Next steps

It would be interesting to someday automate the campaign blocks while still making them mostly editable, as in the following examples:

Maybe someday!

(Also, hat tip to this Reddit post that helped me get xclip to work more reliably from within Emacs by adding -filter 2>& /dev/null to the end of my xclip call so it didn't hang.)

View org source for this post

Run source blocks in an Org Mode subtree by custom ID

| emacs, org

I like the way Org Mode lets me logically group functions into headings. If I give the heading a CUSTOM_ID property (which is also handy for exporting to HTML, as it turns into an link anchor), I can use that property to find the subtree. Then I can use org-babel-execute-subtree to execute all source blocks in that subtree, which means I can mix scripting languages if I want to.

Here's the code:

(defun my-org-execute-subtree-by-custom-id (id &optional filename)
  "Prompt for a CUSTOM_ID value and execute the subtree with that ID.
If called with \\[universal-argument], prompt for a file, and then prompt for the ID."
  (interactive (if current-prefix-arg
                   (let ((file (read-file-name "Filename: ")))
                     (list
                      (with-current-buffer (find-file-noselect file)
                        (completing-read
                         "Custom ID: "
                         (org-property-values "CUSTOM_ID")))
                      file))
                 (list
                  (completing-read "Custom ID: " (org-property-values "CUSTOM_ID")))))
  (with-current-buffer (if filename (find-file-noselect filename) (current-buffer))
    (let ((pos (org-find-property "CUSTOM_ID" id)))
      (if pos
          (org-babel-execute-subtree)
        (if filename(error "Could not find %s in %s" id filename)
          (error "Could not find %s" id))))))

For example, in Using Org Mode, Emacs Lisp, and TRAMP to parse meetup calendar entries and generate a crontab, I have a Emacs Lisp source block that generates a crontab on a different computer, and a shell source block that installs it on that computer.

Technical notes: org-babel-execute-subtree narrows to the current subtree, so if I want anything from the rest of the buffer, I need to widen the focus again. Also, it's wrapped in a save-restriction and a save-excursion, so someday I might want to figure out how to handle the cases where I want to change what I'm looking at.

elisp: links in Org Mode let me call functions by clicking on them or following them with C-c C-o (org-open-at-point). This means I can make links that execute subtrees that might even be in a different file. For example, I can define links like these:

  • [[elisp:(my-org-execute-subtree-by-custom-id "update" "~/sync/emacs-calendar/README.org")][Update Emacs calendar]]
  • [[elisp:(my-org-execute-subtree-by-custom-id "crontab" "~/sync/emacs-calendar/README.org")][Update Emacs meetup crontab]]

That could be a good starting point for a dashboard.

Related: Execute a single named Org Babel source block

This is part of my Emacs configuration.
View org source for this post