mastodon.el: Collect handles in clipboard (Emacs kill ring)

| mastodon, emacs

I sometimes want to thank a bunch of people for contributing to a Mastodon conversation. The following code lets me collect handles in a single kill ring entry by calling it with my point over a handle or a toot, or with an active region.

(defvar my-mastodon-handle "@sacha@social.sachachua.com")
(defun my-mastodon-copy-handle (&optional start-new beg end)
  "Append Mastodon handles to the kill ring.

Use the handle at point or the author of the toot.  If called with a
region, collect all handles in the region.

Append to the current kill if it starts with @. If not, start a new
kill. Call with \\[universal-argument] to always start a new list.

Omit my own handle, as specified in `my-mastodon-handle'."
  (interactive (list current-prefix-arg
                     (when (region-active-p) (region-beginning))
                     (when (region-active-p) (region-end))))
  (let ((handle
         (if (and beg end)
             ;; collect handles in region
             (save-excursion
               (goto-char beg)
               (let (list)
                 ;; Collect all handles from the specified region
                 (while (< (point) end)
                   (let ((mastodon-handle (get-text-property (point) 'mastodon-handle))
                         (button (get-text-property (point) 'button)))
                     (cond
                      (mastodon-handle
                       (when (and (string-match "@" mastodon-handle)
                                  (or (null my-mastodon-handle)
                                      (not (string= my-mastodon-handle mastodon-handle))))
                         (cl-pushnew
                          (concat (if (string-match "^@" mastodon-handle) ""
                                    "@")
                                  mastodon-handle)
                          list
                          :test #'string=))
                       (goto-char (next-single-property-change (point) 'mastodon-handle nil end)))
                      ((and button (looking-at "@"))
                       (let ((text-start (point))
                             (text-end (or (next-single-property-change (point) 'button nil end) end)))
                         (dolist (h (split-string (buffer-substring-no-properties text-start text-end) ", \n\t"))
                           (unless (and my-mastodon-handle (string= my-mastodon-handle h))
                             (cl-pushnew h list :test #'string=)))
                         (goto-char text-end)))
                      (t
                       ;; collect authors of toots too
                       (when-let*
                           ((toot (mastodon-toot--base-toot-or-item-json))
                            (author (and toot
                                         (concat "@"
                                                 (alist-get
                                                  'acct
                                                  (alist-get 'account (mastodon-toot--base-toot-or-item-json)))))))
                         (unless (and my-mastodon-handle (string= my-mastodon-handle author))
                           (cl-pushnew
                            author
                            list
                            :test #'string=)))
                       (goto-char (next-property-change (point) nil end))))))
                 (setq handle (string-join (seq-uniq list #'string=) " "))))
           (concat "@"
                   (or
                    (get-text-property (point) 'mastodon-handle)
                    (alist-get
                     'acct
                     (alist-get 'account (mastodon-toot--base-toot-or-item-json))))))))
    (if (or start-new (null kill-ring) (not (string-match "^@" (car kill-ring))))
        (kill-new handle)
      (dolist (h (split-string handle " "))
        (unless (member h (split-string " " (car kill-ring)))
          (setf (car kill-ring) (concat (car kill-ring) " " h)))))
    (message "%s" (car kill-ring))))

Another perk of tooting from Emacs using mastodon.el. =)

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

2025-03-24 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

mastodon.el: Copy toot URL after posting; also, copying just this post with 11ty

| mastodon, emacs, 11ty

I often want to copy the toot URL after posting a new toot about a blog post so that I can update the blog post with it. Since I post from Emacs using mastodon.el, I can probably figure out how to get the URL after tooting. A quick-and-dirty way is to retrieve the latest status.

(defvar my-mastodon-toot-posted-hook nil "Called with the item.")

(defun my-mastodon-copy-toot-url (toot)
  (interactive (list (my-mastodon-latest-toot)))
  (kill-new (alist-get 'url toot)))
(add-hook 'my-mastodon-toot-posted-hook #'my-mastodon-copy-toot-url)

(defun my-mastodon-latest-toot ()
  (interactive)
  (require 'mastodon-http)
  (let* ((json-array-type 'list)
         (json-object-type 'alist))
    (car
     (mastodon-http--get-json
      (mastodon-http--api
       (format "accounts/%s/statuses?count=1&limit=1&exclude_reblogs=t"
               (mastodon-auth--get-account-id)))
      nil :silent))))

(with-eval-after-load 'mastodon-toot
  (when (functionp 'mastodon-toot-send)
    (advice-add
     #'mastodon-toot-send
     :after
     (lambda (&rest _)
       (run-hook-with-args 'my-mastodon-toot-posted-hook (my-mastodon-latest-toot)))))
  (when (functionp 'mastodon-toot--send)
    (advice-add
     #'mastodon-toot--send
     :after
     (lambda (&rest _)
       (run-hook-with-args 'my-mastodon-toot-posted-hook (my-mastodon-latest-toot))))))

I considered overriding the keybinding in mastodon-toot-mode-map, but I figured using advice would mean I can copy things even after automated toots.

A more elegant way to do this might be to modify mastodon-toot-send to run-hook-with-args a variable with the response as an argument, but this will do for now.

I used a hook in my advice so that I can change the behaviour from other functions. For example, I have some code to compose a toot with a link to the current post. After I send a toot, I want to check if the toot contains the current entry's permalink. If it has and I don't have a Mastodon toot field yet, maybe I can automatically set that property, assuming I end up back in the Org Mode file I started it from.

(defun my-mastodon-org-maybe-set-toot-url (toot)
  (when (derived-mode-p 'org-mode)
    (let ((permalink (org-entry-get-with-inheritance "EXPORT_ELEVENTY_PERMALINK")))
      (when (and permalink
                 (string-match (regexp-quote permalink) (alist-get 'content toot))
                 (not (org-entry-get-with-inheritance "MASTODON")))
        (save-excursion
          (goto-char (org-find-property "EXPORT_ELEVENTY_PERMALINK"
                                        permalink))
          (org-entry-put
           (point)
           "EXPORT_MASTODON"
           (alist-get 'url toot))
          (message "Toot URL set: %s, republish if needed" toot))))))
(add-hook 'my-mastodon-toot-posted-hook #'my-mastodon-org-maybe-set-toot-url)

If I combine that with a development copy of my blog that ignores most of my posts so it compiles faster and a function that copies just the current post's files over, I can quickly make a post available at its permalink (which means the link in the toot will work) before I recompile the rest of the blog, which takes a number of minutes.

(defun my-org-11ty-copy-just-this-post ()
  (interactive)
  (when (derived-mode-p 'org-mode)
    (let ((file (org-entry-get-with-inheritance "EXPORT_ELEVENTY_FILE_NAME"))
          (path my-11ty-base-dir))
      (call-process "chmod" nil nil nil "ugo+rwX" "-R" (expand-file-name file (expand-file-name "_local" path)))
      (call-process "rsync" nil (get-buffer-create "*rsync*") nil "-avze" "ssh"
                    (expand-file-name file (expand-file-name "_local" path))
                    (concat "web:/var/www/static-blog/" file))
      (browse-url (concat (replace-regexp-in-string "/$" "" my-blog-base-url)
                          (org-entry-get-with-inheritance "EXPORT_ELEVENTY_PERMALINK"))))))

The proper blog updates (index page, RSS/ATOM feeds, category pages, prev/next links, etc.) can happen when the publishing is finished.

So my draft workflow is:

  1. Write the post.
  2. Export it to the local NODE_ENV=dev npx eleventy --serve --quiet with ox-11ty.
  3. Check that it looks okay locally.
  4. Use my-org-11ty-copy-just-this-post and confirm that it looks fine.
  5. Compose a toot with my-mastodon-11ty-toot-post and check if sending it updates the Mastodon toot.
  6. Re-export the post.
  7. Run my blog publishing process. NODE_ENV=production npx eleventy --quiet and then rsync.

Let's see if this works…

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

On this day

| 11ty, js

Nudged by org-daily-reflection (@emacsomancer's toot) and Jeremy Keith's post where he mentions his on this day page, I finally got around to making my own on this day page again. I use the 11ty static site generator, so it's static unless you have Javascript enabled. It might be good for bumping into things. I used to have an "On this day" widget back when I used Wordpress, which was fun to look at occasionally.

The code might be a little adamant about converting all the dates to America/Toronto:

11ty code for posts on this day
export default class OnThisDay {
  data() {
    return {
      layout: 'layouts/base',
      permalink: '/blog/on-this-day/',
      title: 'On this day'
    };
  }

  async render(data) {
    const today = new Date(new Date().toLocaleString('en-US', { timeZone: 'America/Toronto' }));
    const options = { month: 'long', day: 'numeric' };
    const date = today.toLocaleDateString('en-US', options);
    const currentMonthDay = today.toISOString().substring(5, 10);
    let list = data.collections._posts
        .filter(post => {
          const postDateTime = new Date(post.date).toLocaleString('en-US', { timeZone: 'America/Toronto' });
          const postMonthDay = (new Date(postDateTime)).toISOString().substring(5, 10);
          return postMonthDay === currentMonthDay;
        })
        .sort((a, b) => {
          if (a.date < b.date) return 1;
          if (a.date > b.date) return -1;
          return 0;
        })
        .map(post => {
          const postDateTime = new Date(post.date).toLocaleString('en-US', { timeZone: 'America/Toronto' });
          const postDate = new Date(postDateTime);
          const postYear = postDate.getFullYear();
          return `<li>${postYear}: <a href="${post.url}">${post.data.title}</a></li>`;
        })
        .join('\n');
    list = list.length > 0
      ? `<ul>${list}</ul>`
      : `<p>No posts were written on ${date} in previous years.</p>`;

    return `<section><h2>On this day</h2>
<p>This page lists posts written on this day throughout the years. If you've enabled Javascript, it will show the current day. If you don't, it'll show the posts from the day I last updated this blog. You might also like to explore <a href="/blog/all">all posts</a>, <a href="/topic">a topic-based outline</a> or <a href="/blog/category">categories</a>.</p>
<h3 class="date">${date}</h3>
<div id="posts-container">${list}</div>

<script>
  $(document).ready(function() { onThisDay(); });
</script>
</section>`;
  }
};
Client-side Javascript for the dynamic list
function onThisDay() {
  const tz = 'America/Toronto';
  function getEffectiveDate() {
    const urlParams = new URLSearchParams(window.location.search);
    const dateParam = urlParams.get('date');
    if (dateParam && /^\d{2}-\d{2}$/.test(dateParam)) {
      const currentYear = new Date().getFullYear();
      const dateObj = new Date(`${currentYear}-${dateParam}T12:00:00Z`);
      if (dateObj.getTime()) {
        return {
          monthDay: dateParam,
          formatted: dateObj.toLocaleDateString('en-US', { month: 'long', day: 'numeric' })
        };
      }
    }
    const today = new Date(new Date().toLocaleString('en-US', { timeZone: tz }));
    return {
      monthDay: today.toISOString().substring(5, 10), // MM-DD
      formatted: today.toLocaleDateString('en-US', { month: 'long', day: 'numeric' })
    };
  }
  // Fetch and process the posts
  fetch('/blog/all/index.json')
    .then(response => response.json())
    .then(posts => {
      const dateInfo = getEffectiveDate();
      const dateElement = document.querySelector('h3.date');
      if (dateElement) {
        dateElement.textContent = dateInfo.formatted;
      }
      const matchingPosts = posts.filter(post => {
        const postDate = new Date(post.date).toLocaleString('en-US', { timeZone: tz });
        const postMonthDay = (new Date(postDate)).toISOString().substring(5, 10);
        return postMonthDay === dateInfo.monthDay;
      });

      matchingPosts.sort((a, b) => {
        const dateA = new Date(a.date);
        const dateB = new Date(b.date);
        return dateB - dateA;
      });

      const elem = document.getElementById('posts-container');
      if (matchingPosts.length > 0) {
        const postsHTML = matchingPosts.map(post => {
          const postDate = new Date(post.date).toLocaleString('en-US', { timeZone: tz });
          const postYear = new Date(postDate).getFullYear();
          return `<li>${postYear}: <a href="${post.permalink}">${post.title}</a></li>`;
        }).join('\n');
        elem.innerHTML = `<ul>${postsHTML}</ul>`;
      } else {
        elem.innerHTML = `<p>No posts were written on ${dateInfo.formatted}.</p>`;
      }
    })
    .catch(error => {
      console.error('Error fetching posts:', error);
    });
}

I used to include the day's posts as a footer on the individual blog post page. That might be something to consider again.

View org source for this post

Stick figure out feelings

Posted: - Modified: | drawing

Feel free to use or remix these stick figures under the Creative Commons Attribution License.

Text and links from sketch

Stick figure out feelings https://sachachua.com/2025-03-22-02

Feelings wheel by Geoffrey Roberts, stick figures by Sacha Chua and the kiddo

  • happy
    • playful
    • content
    • interested
    • proud
    • accepted
    • powerful
    • peaceful
    • trusting
    • optimistic
  • surprised
    • startled
    • confused
    • amazed
    • excited
  • bad
    • tired
    • busy
    • stressed
    • bored
  • fearful
    • scared
    • anxious
    • weak
    • rejected
    • insecure
    • threatened
  • angry
    • let down
    • humiliated
    • bitter
    • mad
    • aggressive
    • frustrated
    • distant
    • critical
  • disgusted
    • disapproving
    • disappointed
    • awful
    • repelled
  • sad
    • lonely
    • vulnerable
    • despair
    • guilty
    • depressed
    • hurt

I had fun drawing stick figures based on Geoffrey Roberts' emotion wheel while waiting for A+. After she finished her class, she sat with me, suggesting some ways to improve the expressions and even adding her own flair.

We imagined another sketch showing cats expressing the different emotions. A+ already has a title for that sketch: "Feline feelings." It'll be a good challenge, figuring out how to draw cats clearly enough to show those emotions. Related: this sketch of bird stickers on r/Supernote.

Other variations: drawing other emotion wheels, like the Plutchik wheel or the Junto wheel. Some wheels vary emotional intensity, which will be a nice exercise.

A challenge: working on the outer ring of emotions. How do I distinguish "disillusioned" from "perplexed"? What about "free" from "joyful"?

I found my copy of Bikablo Emotions, and I'm looking forward to picking up more tips from it. I remember flipping through it for my post on sketchnotes: Building my visual vocabulary (2013). So many things to explore… =)

[2025-03-26 Wed]: Follow-up: Feline feelings

View org source for this post

Weekly review: Week ending March 21, 2025

| review, weekly

Some walking, some writing, some Emacs tweaking. A+ and I went to a pottery wheel workshop. That was nice. My eyes have been dry lately, so I've been using eye drops.

Blog posts

Sketches

Toots

  • On Michel de Montaigne's tangents: quote from Je Replie Ma Vue Au Dedans | Brain Baking (toot)

    “One of the consequences of his unique approach to writing is the many digressions present in the Essais. And with many, I mean a great deal of 'em. Most, if not all, essays only mention the topic—as supposedly made apparent to the reader via the title—in passing. Bakewell picks out an example: About chariots. The text starts with a digression on writing, sways over to the very compelling subject of sneezing only to land on the actual topic two pages later to then to drift off again onto a summary of recent happenings in the New World.”

    If I meander, at least I'm in excellent company.

  • On intentional friction - quote from PKM Summit 2025 Notes | Brain Baking (toot) Intentional friction: slow down and add context (your why) for tasks and notes. I like this because it makes it easier to pick things up again and actually do something about it. Related thought: turning books into action items

    “Someone else then advised to add context: why did you record this, or why do you think this might be important? If you can't write that down, then don't save it. This is added friction: constantly aiming to reduce friction is not always beneficial to your system. We still have the habit to collect too much stuff and do too little with it. This seemed to be a shared struggle among attendants and speakers alike.”

  • On sharing your questions - quote from Ness Labs on collective curiosity (toot) Also via @takeonrules's journal entry

    1. Mapping the unknown. Many breakthroughs start when someone admits “I don't understand why…” Sit down with your colleagues and explicitly write down what you don't know or understand about a topic. This turns knowledge gaps into shared opportunities for discovery. 

    This reminds me of that link I just shared about a person's big questions: https://tracydurnell.com/questions/
    another example: https://reeswrites.com/about-big-questions/

    Oh hey, Ness Labs = Anne-Laure Le Cunff, of the ADHD and curiosity paper I've also got a link to somewhere in my drafts; adding another blog to my feed reader

    Followed up: I started a list of questions I often consider, inspired by Tracy Durnell.

  • On the density and invisibility of digital notes (toot)

    And these digital files take a different kind of stewardship. The density of information per cubic inch of material is mind-boggling. Yet that density of information exists invisible to our analogue self, we need wizardry to make it visible and hopefully known. This density and invisibility, I suspect, makes it easy to lose and misplace and disregard.

    It's difficult to get this sense of heft for digital thoughts. I wanted go experiment with that a bit using treemaps, but I'm not quite there yet. Spatial relationships are interesting too. I used to lay out index card sketches. Maybe I'll learn how to use Noteful or similar apps to get a handle on a larger topic by using sketched and hyperlinked maps…

  • On learning the terminology - quote from "How did you know to do that?" on avdi.codes (toot)

    Learning the terminology is an important step that people struggle with. Communities help with that.

    Just as an example: I've realized that when I'm studying a problem, I rely a lot on “second-order Googling”. That's a process whereby I don't try to discover a solution in a single search. Instead, in my first few searches, I just try to find other people talking about the problem area, using my own naïve description of the task at hand.

    Then, once I discover some conversations that are taking place among people experienced in that domain, I read over them looking for the specific terminology that I had missed. Once I have the terminology, I'm able to use it to compose much more focused searches that usually lead me directly to the answer I'm looking for.

  • On each person shaping Emacs to fit them - quote from BSAG » On the 'Emacs From Scratch' cycle (toot)

    It struck me the other day that there is probably more variation and diversity among different users' Emacs configurations than among the configurations of any other editor. Users are able to change almost any aspect of the way that Emacs functions, with easy access to clear documentation explaining how it works right now, and how you can change it. This means that each instance of Emacs ends up a unique shape, like an old tool with a wooden handle worn down into the shape of its owners' habitual grasp. That simile doesn't quite work, because Emacs users work hard and deliberately to shape their Emacs tools to fit their needs, so it is more than just passive wear.

  • What lights you up? quote from "Little p purpose" – Butterfly Mind (toot)

    Jordan Grumet, the guest on the podcast, addresses this worry. He distinguishes between big P Purpose and little p purpose. Purpose with a big P is the one that gets me, and apparently a lot of people, stressed. It feels like, “Why am I here? What am I meant to do?” It induces anxiety if we want to find Purpose but don't know where to look. Little p purpose, though, does not ask “why?”; it doesn't examine the reason for our existence. Instead it asks, “what lights you up?”

  • On tagging posts with the people you got the ideas from - quote from "Early web influencers" | smays.com (toot) I hadn't considered using tags to tag people's names in blog posts before, but the way it's used in this post is neat. I clocked in the link for Nikol Lohr and saw a series of posts related to that person's thoughts. Interesting.

    This entry was posted in Internet and tagged Bruce Sterling, Chris Pirillo, Clay Shirky, Dan Gillmor, Dave Winer, David Weinberger, Doc Searls, Douglas Coupland, Douglas Rushkoff, Halley Suitt, Hugh MacLeod, Jakob Nielsen, Jeff Jarvis, Kevin Kelly, Mark Cuban, Mark Ramsey, Nikol Lohr, Scott Adams, Seth Godin, Steve Outing, Steven Levy, Terry Heaton, Tom Peters

  • On the connection between reading and writing - quote from "The more I read" - Dan Cullum (toot)

    There is a strong correlation between the amount I’m reading, and the ideas I have for this blog. When I’m reading a lot, I feel like I have ideas coming out my eyes.

  • On books - quote from "The Lost Art of Research as Leisure" by Mariam Mahmoud (toot)

    Writing nearly 350 years earlier, Galileo had declared books “the seal of all the admirable inventions of mankind,” because books allow us to communicate through time and place, and to speak to those “who are not yet born and will not be born for a thousand or ten thousand years.”

    Reminds me of the Great Conversation described in Adler and van Doren's How to Read a Book.

  • Toronto Public Library workers vote resoundingly in favour of strike | Canadian Union of Public Employees (toot)

    Toronto Public Library workers have given their union a strong strike mandate in ongoing contract negotiations with the Toronto Public Library. The workers, represented by CUPE 4948, held a strike vote over the weekend with a historic turnout, where over 96 per cent voted in favour of authorizing the union to take strike action if necessary.

    … CUPE 4948 and the Toronto Public Library have multiple bargaining dates scheduled throughout March. The union remains focused on securing a contract that includes inflation-adjusted wage increases, solutions to chronic understaffing and workplace violence, improved working conditions, and stronger benefits.

    CUPE 4948's Instagram has a few videos from librarians explaining issues around short staffing, precarious work, and other things the union wants to improve.

    The library is one of my favourite parts of Toronto. Librarians are awesome. I want them to feel safe and appreciated. I hope they can come to a good agreement!

  • On solitude - quote from "How to Meet Your Mystery: Thomas Merton on Solitude and the Soul" – The Marginalian (toot)

    Thomas Merton, quoted in the Marginalian:

    The solitary is one who is aware of solitude in himself as a basic and inevitable human reality, not just as something which affects him as an isolated individual. Hence his solitude is the foundation of a deep, pure and gentle sympathy with all other men, whether or not they are capable of realizing the tragedy of their plight.

  • The beginnings of an information workflow - toot

    The beginnings of an information workflow: read on my iPad (bigger screen than my phone, easier to carry around the house than my laptop); share interesting tidbits to Chrome on my phone; share a quote and maybe a thought via Tusky (includes reasonably readable link to context, might spark further conversation); collect those from my GoToSocial instance and archive them in a blog post or Org Mode notes, keeping track of ideas I want to connect or flesh out further

  • On solitude - quote from 'Living Against Time: Virginia Woolf on the Art of Presence and the “Moments of Being” That Make You Who You Are' – The Marginalian (toot) On Virginia Woolf:

    In Moments of Being (public library) — the posthumous collection of her autobiographical writings — she writes:

    A great part of every day is not lived consciously. One walks, eats, sees things, deals with what has to be done; the broken vacuum cleaner; ordering dinner; writing orders to Mabel; washing; cooking dinner; bookbinding. When it is a bad day the proportion of non-being is much larger.

    In her 1925 novel Mrs. Dalloway — part love letter to these moments of being, part lamentation about the proportion of non-being we choose without knowing we are choosing — she locates the key to righting the ratio in “the power of taking hold of experience, of turning it round, slowly, in the light.”

  • On curiosity - quote from "The Hypercuriosity Theory of ADHD" (toot) A+ and I both have strong interest-based focus, which means classwork might be tricky. Fortunately, I can use my interest in helping her grow to help me Learn All the Things so I can advocate for her and help her figure out her brain. Might be ADHD, might be something else, but it's probably a good idea to work with it instead of trying to squish it into something that it's not.

    Given that high trait curiosity might be a strength in ADHD, interventions could focus on harnessing this natural tendency rather than trying to suppress it.

    For instance, AI-assisted tools have shown promise in providing personalized learning experiences for individuals with ADHD, allowing them to engage with material in ways that capitalize on their natural curiosity. Game-based learning has also demonstrated positive effects on engagement and interest, particularly in subjects like mathematics. The Montessori classroom model, which is designed to foster curiosity, has shown promising results—students with ADHD in Montessori settings exhibit more actively engaged on-task behaviors compared to traditional classroom settings. Lastly, outdoor socially-oriented activities have been associated with higher levels of curiosity.

  • On emotional support, parenting, and gold stars - quote from "Free! Live discussion about autism Nov. 13, 7pm ET" - Penelope Trunk (toot) I came across Penelope Trunk's blog again after many years of not regularly reading RSS feeds (aside from the blogs about Emacs, of course).

    This quote resonated:

    But parents have messed up view of what emotional support is, because parents want gold stars for parenting. So the support most parents give is to steer the kid to get gold stars. Parents mistake helping a kid get gold stars for helping a kid feel loved."

    Our kid is 9, bored at school, and procrastinates homework. I know what that's like because I was like that too. (I think she's doing better than I did.) I've been working on fretting less. Pushing her to get the work done and check those checkboxes might not be in her best interest anyhow.

  • On side notes / footnotes - toot

    I like this use of side notes/footnotes at https://www.citationneeded.news/free-and-open-access-in-the-age-of-generative-ai/ . Footnotes use letters to distinguish them from numbered references, and are duplicated as side notes on large screens. I also like the “Show buttons that expand the side note” or “Include side notes after the paragraph on small screens” approaches on other sites.

  • Sketchnoting Science: How to Make Sketchnotes from Technical Content | NIST (toot)

    Enjoyed the examples of technical sketchnotes in https://www.nist.gov/publications/sketchnoting-science-how-make-sketchnotes-technical-content , found via https://www.sketchnotelab.com/p/sketchnote-lab-dispatch-march-2025

Time:

Category The other week % Last week % Diff % h/wk Diff h/wk
Discretionary - Productive 10.4 19.2 8.7 32.4 14.7
Personal 6.9 9.4 2.5 15.9 4.2
Business 0.9 1.7 0.8 2.9 1.4
Discretionary - Play 0.5 1.2 0.6 2.0 1.1
Discretionary - Social 0.0 0.0 0.0 0.0 0.0
Discretionary - Family 0.0 0.0 0.0 0.0 0.0
Sleep 33.8 33.7 -0.2 56.9 -0.3
Unpaid work 3.5 3.3 -0.2 5.5 -0.4
A- 43.9 31.6 -12.3 53.4 -20.6

More piano and writing this week, and less childcare because March Break is over.

Next week: settling into more reading, writing, and drawing.

View org source for this post

Visual book notes: ADHD is Awesome - Penn and Kim Holderness (2024)

| visual-book-notes

(Feel free to use or share this under the Creative Commons Attribution license!)

Text and links from sketch

ADHD is Awesome - Penn and Kim Holderness (2024) sachachua.com/2025-03-20-01

Notes:

  • Ch 1: ADHD 101
  • Ch 2: Diagnosis
  • Ch 3: Inside the ADHD brain
    • all-in or completely off
    • dopamine
    • Great at paying attention, terrible at choosing what pay attention to
  • Ch 4: The ADHD experience
    • checklist
    • reorder if needed
    • immediate; set a time to discuss long-term
  • Ch 5: The emotional side of ADHD
    • full-body experiences
    • overwhelmed: flooded
      • don't want to flip out
  • Ch 6: You're going to be okay
    • Benefits: Creativity, hyperfocus, bold vision, intuition, determination
    • Downsides (manageable!): Inattention, impulsivity, hyperactivity
  • Ch 7: Facing your ADHD
    • Strategies to stay regulated
  • Ch 8: Operation Mindset Shift
    • This is the brain I've got. I can work with it. Maybe it's actually cool.
    • Impulsive -> Creative
    • Distractible -> Curious
    • Noncompliant -> Independent Thinker
  • Ch 9: The ADHD upsides for you
    • chocolate + peanut butter
    • hyperfocus
    • designing your own life
  • Ch 10: The ADHD Upsides for others
  • Ch 11: The Right Stuff
    • Meds help 80-90% of kids, 70% of adults.
    • Behavioral therapy helps too.
    • solve upstream problems
    • carrots, not sticks
  • Ch 12: Charge your battery
    • exercise, sleep, nutrition, connection, medication, meditation (try eyes open)
  • Ch 13: Master your daily routine
    • stash extras
    • 15-min reset
    • cargo pants/clothes
    • songs
    • follow the food
  • Ch 14: Control your environment
    • secure the perimeter from distractions
    • edit your space
    • get comfy
    • right-size stimulation
    • use visual stimulation
  • Ch 15: Get it done
    • meaning
    • checklist
    • breaks, timers
    • reward yourself
    • when it's hard, acknowledge and ask for help
  • Ch 16: How to be an ADHD whisperer
    • connect, don't correct
  • Ch 17: Parents and caretakers
    • Strengths-based
    • slow down, reduce demands
    • parent-training class
  • Ch 18: Taking care of caretakers
    • ADHD: explanation, not excuse
    • useful scripts
  • Ch 19: Listening
    • mine for gold
    • gamify

ADHD is Awesome (2024) by Penn and Kim Holderness is a practical, positive, easy-to-read book on living with ADHD.

I find ADHD-oriented tips useful. My brain is prone to misplacing things, going off on tangents, and having attentional hiccups. Organizing my life around following my interests and minimizing commitments helps me increase happiness and reduce stress. Sketchnotes help me focus on what I'm learning and provide visual stimulation in my notes, making them more fun for me to review and share. I don't stock extras of things in a cabinet, but I do keep an Oops fund so I don't have to beat myself up over mistakes that cost a little money. I don't wear cargo pants, but I do wear vests with lots of pockets, a habit I picked up from my dad. I'm still working on developing that 15-minute reset habit, and on seeing and doing something about clutter.

As for the kiddo, there's no getting A+ to do things she's not interested in, and there's no holding her back if she's focused on something. Tips for parenting kids with ADHD also seem to work well for her: breaks, timers, taking advantage of hyperfocus, avoiding shame. My job is to:

  • Practise connecting instead of correcting: Fretting at her doesn't accomplish anything. We work better when we feel connected.
  • Explore and model things that work for me: I can show her how I use sketchnotes, checklists, timers, breaks, curiosity, learning, experimentation, self-compassion… Also, taking care of my sleep/exercise/happiness makes it easier to be the kind of parent I want to be.
  • Help her learn how to figure things out for herself: I can help her navigate systems that aren't designed for her (like school) and figure out things that would work better for her.
  • Frame things positively: Finding positive ways to frame our quirks can help with both self-image and other people's perceptions (chapter 4). Focusing on our strengths works better than beating ourselves up for our weaknesses. We still want to work around our weaknesses so they don't limit us, but might be able to use our strengths to do that.

The Hypercuriosity Theory of ADHD (and the paper) is also a good read that's somewhat related.

See related Mastodon discussion

View org source for this post