Notes

This is my microblog, containing short informal entries. See my blog for longer entries. An RSS feed contains the full text of all my notes.

Srijan Choudhary Srijan Choudhary

Noticed that the comment form was not working here since my last upgrade of Kirby and the komments plugin. Fixed it now.

Srijan Choudhary Srijan Choudhary

In reply to Your RSS Reader Is Robbing You by Antonio Santos

Your RSS Reader Is Robbing You https://antoniosantos.io/your-rss-reader-is-robbing-you/ 🫧 via https://bubbles.town/entry/44749008

I often read on my feed reader by default, but open the original page if I like the article or want to read more from the same author. And yes, often the designs are unique and inspiring.

Srijan Choudhary Srijan Choudhary

Liked Somewhere, I'm online and listening to music by Cory Dransfeldt

For a while now, my home page has shown whatever song I'm listening to (or, if idle, the last one I played). Initially, it was powered by last.fm. As I've built my own scrobbler, I populated the element from my own data. The static implementation is straightforward: I store each listen as a record.…
Srijan Choudhary Srijan Choudhary

#TIL that #Emacs also has a Global Mark Ring:

the global mark ring records a sequence of buffers that you have been in, and, for each buffer, a place where you set the mark

For programming buffers / projects, I've been using the xref stack to go back/forward when jumping around. But the global mark ring is super useful as a general purpose tracker of my context jumps.

By default, C-x C-<SPC> jumps back. There is no forward like xref-go-forward, but it' a ring so it's possible to go around. Or there's always consult-global-mark to show the marks in a list and select from it.

Other helpful links:

Srijan Choudhary Srijan Choudhary

Liked Fable's judgement by Simon Willison’s Weblog

One of the most interesting tips I got from the Fireside Chat I hosted with Cat Wu and Thariq Shihipar from the Claude Code team at AIE on Wednesday was …
Srijan Choudhary Srijan Choudhary

Liked I bought a Sony Walkman - 82MHz

The Walkman is the Sony WM-EX521 from 2002, which is a pretty late model. It's not one of the classics from the 80s, but I really like the design, the case is made out of metal so it looks and feels really solid and with it being relatively young, I don't expect too many problems. In fact, I had a suspicion that the only thing that was wrong with it might be the belt.
Srijan Choudhary Srijan Choudhary

Liked TIL: Recipe Schemas by Yash Garg

Apparently there’s a schema for recipes??? I was genuinely surprised when Mealie popped up a parsing dialog while I was trying to import a plain-text recipe. Turns out websites can embed recipes using JSON-LD, following the Schema.org Recipe specification. Mealie Error Dialog I had no idea this…
Srijan Choudhary Srijan Choudhary

Liked Libraries are the best by Milan

A couple of weeks ago I decided to read John Green’s book, Everything is Tuberculosis, in part as research for the novel I am writing about a tuberculosis outbreak. Initially I considered buying it, but remembered the weak state of my finances and checked the Toronto Public Library system. A…
Srijan Choudhary Srijan Choudhary

Liked Hot new laptop features by Chad

Im obsessed with this laptop our 7 year old made: I asked him what the different features were. Check out these specs: Ghost button unleashes a ghost from the laptop Crossed-out ghosts buttons bring ghosts back in DO NOT PUSH button activates his laser hand (i.e. an empty cup from a local ice cream…
Srijan Choudhary Srijan Choudhary

Liked Setting up Webmentions on my Static Site πŸ’¬ by Alex Hyett

I have been getting back into blogging recently. I know I write this newsletter every 2 weeks, but I try and keep to a set number of topics as I know my audience is mostly developers. My blog gives me chance to write about whatever is on my mind, without worrying about it being relevant to my…
Srijan Choudhary Srijan Choudhary

In reply to mauricerenck/komments

SQLite comment storage (v3) breaks page-cache invalidation (staticache): comments show in Panel but not on cached pages

Summary

Since v3 moved comment storage from inline content-file fields to SQLite, komments no longer triggers Kirby's page-cache invalidation when a comment or webmention changes. On any site that uses a page cache β€” in particular the official getkirby/staticache β€” new comments show up in the Panel (which reads the DB live) but never appear on the public page, which keeps serving stale cached HTML until the page's content file happens to be edited for some unrelated reason.

This is effectively a silent regression for anyone who paired komments with a page cache.

Root cause

  • In v2, received comments/webmentions were written into the page's content file. A content-file write is a page change, so Kirby automatically flushed that page's cache and the public page updated on the next request β€” invalidation came "for free" as a side effect.
  • In v3 with storage.type => 'sqlite', comments are written to the SQLite DB and the content file is never touched. Kirby only invalidates a page's cache entry when the page/model itself changes, so nothing flushes the cache. $page->comments() reads live from the DB on render, but with a page cache active the cached HTML is served without render() ever being called.

Steps to reproduce

  1. Kirby with page caching enabled, e.g. getkirby/staticache (cache.pages.type => 'static').
  2. komments v3 with storage.type => 'sqlite'. Webmentions auto-publish by default; comments via a moderated-then-published flow.
  3. Visit a post once to prime the cache.
  4. Receive a webmention (or publish a comment) for that post.
  5. Panel shows the comment; the public page does not (stale cached HTML). It only corrects itself if the page's content file is later edited.

Expected

Adding, publishing, or removing a comment/webmention for a page should mark that page's cache stale, so the next request re-renders with the current comments.

What already works vs. the gaps

komments already fires hooks integrators can subscribe to for cache invalidation:

  • komments.comment.received
  • komments.comment.replied
  • komments.comment.published (fires on the publish/unpublish toggle, both directions)

But several mutations that change public output fire no event at all, so there is no way to invalidate on them:

  • deleteComment / deleteCommentsInBatch (moderation delete) β€” no trigger
  • flagComment / flagCommentsInBatch (spam/flag, which can hide a comment) β€” no trigger

These live under the plugin's api routes, so they also can't be caught via Kirby's route:after hook (that only fires for the front-end router, not the Panel API), and there is no API-level hook. So today a delete or spam-flag can't be reliably detected by an integrator.

Suggestions (any one would help)

  1. Emit a complete set of mutation hooks. Add triggers for delete and flag and their batch variants β€” e.g. komments.comment.deleted / komments.comment.flagged β€” mirroring the existing received / published / replied events. A complete event surface lets integrators reliably purge the cache for the affected page(s).
  2. Optional built-in page-cache purge. When a comment for a page changes, remove that page's entry from kirby()->cache('pages') (driver-agnostic β€” works for file, APCu, Redis, and staticache alike). Could be gated behind an option such as mauricerenck.komments.flushPageCache => true.
  3. At minimum, document the caveat. Note in the SQLite-storage docs that DB storage no longer auto-invalidates page caches, and that integrators using a page cache must wire up invalidation via the hooks above.
Srijan Choudhary Srijan Choudhary

Knoppix nostalgia

Oh man, fond memories.
I remember being very interested in programming in middle/high school, but all the environments in our school computer lab had windows (this was in India), and I think at that time (maybe 2001-2003) I didn't even know there were other operating systems.
Our school was participating in something called International Cyber Olympiad, and of course I gave the eligibility exam.
They sent all students who passed a Knoppix Live CD to prepare for the actual competition. We did not have a PC at home until a couple of years later, but I used that CD in any PC I could find anywhere - the school computer lab, the school library computers, and my dad's office computers. It was my first experience with a Linux system (and I found it awesome). Also my first experience with gcc instead of borland c++.

Srijan Choudhary Srijan Choudhary

Liked Star Wars Outlaws is really good by Joel Auterson

So I rolled credits on Star Wars Outlaws today and I have come away from it feeling far more strongly than I ever expected. I think, like a lot of people, I’d sort of written off this game at launch. I’ve grown fatigued with open-world games in general, and in particular with Ubisoft’s style of…
Srijan Choudhary Srijan Choudhary

A small #Emacs #OrgMode quality-of-life tweak. I often need to replace an org heading's title while preserving the original text in the body. The problem is that pressing enter on a heading inserts a line above the properties drawer, which breaks things.

Here's a function that moves the heading title into the body (below the properties drawer and metadata), and binds it to S-RET:

(defun my-org-demote-title-to-body ()
  "Move the current heading's title into the body, below the metadata.
  Point returns to the heading for editing."
  (interactive)
  (org-back-to-heading t)
  (let* ((element (org-element-at-point))
         (title (org-element-property :raw-value element)))
    (org-edit-headline "")
    (save-excursion
      (org-end-of-meta-data t)
      (insert title "\n"))
    (org-beginning-of-line)))

(defun my-org-shift-return ()
  "On a heading, demote title to body. In a table, copy down."
  (interactive)
  (cond
   ((org-at-heading-p) (my-org-demote-title-to-body))
   ((org-at-table-p) (org-table-copy-down 1))
   (t (org-return))))
  (define-key org-mode-map (kbd "S-<return>") #'my-org-shift-return)
Srijan Choudhary Srijan Choudhary

Faced a failing disk in my raidz2 ZFS pool today.

Recovery was pretty simple:

  1. Asked the service provider to replace the disk
  2. Find new disk ID etc using:
    lsblk -o NAME,SIZE,MODEL,SERIAL,LABEL,FSTYPE
    ls -ltrh /dev/disk/by-id/ata-*
  3. Resilver using:
    sudo zpool replace lake <old_disk_id> <new_disk_id>
  4. Watch status using:
    watch zpool status -v

Re-silvering is still ongoing, but hopefully completes without issues. Will run a manual zpool scrub at the end to make sure everything is okay.

Srijan Choudhary Srijan Choudhary

A small elisp snippet that I found useful. I often switch between terminals and #Emacs, and they have slightly different behaviors for C-w. This makes it behave the same in Emacs as it does in bash/zsh/fish etc - deletes the last word. It retains the kill-region behavior if a region is actually selected.

(defun kill-region-or-backward-word ()
  "If the region is active and non-empty, call `kill-region'.
Otherwise, call `backward-kill-word'."
  (interactive)
  (call-interactively
   (if (use-region-p) 'kill-region 'backward-kill-word)))
(global-set-key (kbd "C-w") 'kill-region-or-backward-word)

Ref: https://stackoverflow.com/questions/13844453/how-do-i-make-c-w-behave-the-same-as-bash

Srijan Choudhary Srijan Choudhary

In reply to Make *HNComments* buffer read-only and allow "q" to dismiss. · Issue #12 · thanhvg/emacs-hnreader by GitHub

If I'm to edit any comment text, it'd be after I'd copied into some org-roam / orgrr note for posterity. So I keep wanting to press "q" to get out of the comments view. (org-mode) (read-only-mode 1...

I'm overriding it like this:

    (defun my-hnreader-comments-readonly (dom url)
      (view-mode 1)
      (org-fold-show-all)
      )
    (advice-add
     'hnreader--print-comments
     :after
     'my-hnreader-comments-readonly
     )
Srijan Choudhary Srijan Choudhary

Liked Pitfalls to avoid as a programming noob by pharpend

tl;dr "Where to I get started learning how to program?" There are 3 correct answers; more detail below: SICP: Structure and Interpretation of Computer Programs, by Abelson and Sussman. There is a video lecture series There is also a book, more or less identical to the lectures, which you can read…
Srijan Choudhary Srijan Choudhary

gcloud_ssh

A simple script that finds a google cloud compute VM by IP address across all projects of an organization and runs gcloud ssh to it.

#!/bin/bash

GCLOUD_SSH_FLAGS="--internal-ip"

# Get organization ID dynamically
get_org_id() {
    gcloud organizations list --format="value(name)" --limit=1 2>/dev/null | sed 's|organizations/||'
}

search_and_connect() {
    local ip_address=$1

    echo "Searching for IP: $ip_address across organization..."

    # Get organization ID
    ORG_ID=$(get_org_id)
    if [ -z "$ORG_ID" ]; then
        echo "Failed to get organization ID. Make sure you have organization-level access."
        exit 1
    fi

    # Search for instance with this IP address
    RESULT=$(gcloud asset search-all-resources \
        --scope=organizations/$ORG_ID \
        --query="$ip_address" \
        --asset-types='compute.googleapis.com/Instance' \
        --format=json 2>/dev/null)

    if [ -z "$RESULT" ] || [ "$RESULT" = "[]" ]; then
        echo "IP address $ip_address not found in organization."
        exit 1
    fi

    # Parse JSON to extract instance details
    INSTANCE_NAME=$(echo "$RESULT" | jq -r '.[0].name' | sed 's|.*/||')
    PROJECT=$(echo "$RESULT" | jq -r '.[0].parentFullResourceName' | sed 's|.*/||')
    ZONE=$(echo "$RESULT" | jq -r '.[0].location' | sed 's|.*/||')
    STATE=$(echo "$RESULT" | jq -r '.[0].state')

    if [ "$INSTANCE_NAME" = "null" ] || [ "$PROJECT" = "null" ] || [ "$ZONE" = "null" ]; then
        echo "Failed to parse instance details from search result."
        echo "Raw result: $RESULT"
        exit 1
    fi

    # Check if instance is running
    if [ "$STATE" != "RUNNING" ]; then
        echo "Instance $INSTANCE_NAME is not running (state: $STATE)."
        echo "Cannot connect to a non-running instance."
        exit 1
    fi

    echo "Found instance: $INSTANCE_NAME in zone: $ZONE (project: $PROJECT)"

    # Generate and display the SSH command
    SSH_COMMAND="gcloud compute ssh $INSTANCE_NAME --zone=$ZONE --project=$PROJECT ${GCLOUD_SSH_FLAGS}"
    echo "SSH command: $SSH_COMMAND"

    # Execute the SSH command
    echo "Connecting to $INSTANCE_NAME..."
    exec $SSH_COMMAND
}

# Main script logic
case "${1:-}" in
    "")
        echo "Usage: $0 <IP_ADDRESS>"
        echo "  <IP_ADDRESS>  - Connect to instance with this IP"
        exit 1
        ;;
    *)
        search_and_connect "$1"
        ;;
esac
Srijan Choudhary Srijan Choudhary

Liked Dr. Neckbeard, or how I learned to stop worrying and love Emacs

So, you might know that I’m a text editor junkie. At a job in the 1990s, I used a great Windows-only editor called HomeSite for web development. When I moved to the Mac in 2001, I wrote to Allaire, the developers, and asked if there was a Mac version in the works. They wrote back and explained…
Srijan Choudhary Srijan Choudhary

Quick note for me to generate #Emacs TAGS file for an #Erlang project:

find {src,apps,_build/default,$(dirname $(which erl))/../lib} -name "*.[he]rl" | xargs realpath --relative-to="$(pwd)" | etags.emacs -o TAGS -

The relative path ensures that this works over tramp as well.

Srijan Choudhary Srijan Choudhary

Ability to pass options (before command) to vdirsyncer

Hi. I've been using khalel + khal + vdirsyncer for the last few days, and it has been an absolute joy. I tried various ways of working with my work calendar in my org system, and this has been the best in terms of stability and simplicity.

However, in my setup, vdirsyncer shows a lots of warnings for "Skipping identical href" or "Server did not supply properties" - possibly because I'm syncing with a pretty old google calendar that might have some bad entries. I want to run sync with vdirsyncer -verror sync to silence these warnings in the output of khalel-run-vdirsyncer, but continue to show errors.

I could not find a way to make this configurable, because the -v flag comes before the sync command, and setting khalel-vdirsyncer-command to vdirsyncer -v does not work.

Similarly, someone could have the use case of passing a different config file using vdirsyncer -c .custom/location sync (I don't).

So, I think a way to configuring custom flags for vdirsyncer makes sense.

Srijan Choudhary Srijan Choudhary

Show custom fields in issues list and detail pages

Is there a way to show additional custom field information in the issues list table and in the issue detail page?

Note that custom fields can be of type string/datetime/user/link etc.

Srijan Choudhary Srijan Choudhary

Error when introspection results have a root node element without name attribute

The name attribute is optional for the root node element in introspection results.

From https://dbus.freedesktop.org/doc/dbus-specification.html#introspection-format :

Only the root <node> element can omit the node name, as it's known to be the object that was introspected. If the root <node> does have a name attribute, it must be an absolute object path. If child <node> have object paths, they must be relative.

When writing a test case for another issue, I found that dbus services written using C++ QT Dbus library can cause this issue.

I will raise a pull request to fix both of these issues including test cases.

Srijan Choudhary Srijan Choudhary

Crash when introspecting remote service object with overloaded methods

From what I understand, the dbus spec does not explicitly allow or disallow overloading methods. But, there are instances of overloaded methods in different applications (specially KDE based), and erlang-dbus does not handle it gracefully - it crashes.

Example

org.kde.plasmashell's /org/kde/osdService path exposes two methods with the same name but different number of arguments.

Output from qdbus

$ qdbus org.kde.plasmashell /org/kde/osdService
...
method void org.kde.osdService.volumeChanged(int percent)
method void org.kde.osdService.volumeChanged(int percent, int maximumPercent)
...

erlang-dbus

> {ok, Bus} = dbus_bus_reg:get_bus(session).
{ok,<0.110.0>}
> {ok, Service} = dbus_bus:get_service(Bus, 'org.kde.plasmashell').                   
{ok,<0.112.0>}
> {ok, RemoteObject} = dbus_remote_service:get_object(Service, '/org/kde/osdService').
=ERROR REPORT==== 10-Apr-2025::06:22:35.537460 ===
Error parsing introspection infos: {case_clause,
                                    {fatal_error,
                                     {key_exists,<<"volumeChanged">>}}}

=ERROR REPORT==== 10-Apr-2025::06:22:35.537539 ===
Error introspecting object '/org/kde/osdService': parse_error

erlang-dbus crashes on this because it tries to insert an element into a gb_trees structure with a key that already exists.

I checked the behavior in pydbus, and it looks like it does not handle this fully either. It only shows the last method in the list (in this case, the one with two arguments). But, it does not crash.

This can be fixed by replacing gb_trees:insert/3 with gb_trees:enter/3 - which makes it match the behavior of pydbus.

While trying to write a test case for this issue by writing an example service using QT dbus library (which allows overloading methods), I found another issue in handling root node element without a name attribute in introspection results.

I will raise a pull request to fix both of these issues including test cases.

Srijan Choudhary Srijan Choudhary

I use this too, but elfeed-protocol does not have two-way sync built in (see FAQ#4 on https://github.com/fasheng/elfeed-protocol#qa).

However, there are workarounds, and I use this: https://github.com/fasheng/elfeed-protocol/issues/71#issuecomment-2483697511 - I call this function manually when I know I've read some things on my phone and want to re-sync read status.

Srijan Choudhary Srijan Choudhary

Read Jeremy's post on quickly switching the default browser.

I had a shell script to do this as well. Doing it from Emacs makes more sense because I can have a completion UI.

So, here's my modified version for Linux:

(defun sj/default-browser (&optional name)
  "Set the default browser based on the given NAME."
  (interactive
   (list
    (completing-read
     "Browser: "
     (split-string
      (shell-command-to-string
       "find /usr/share/applications ~/.local/share/applications -name \"*.desktop\" -exec grep -l \"Categories=.*WebBrowser\" {} \\;")
      "\n" t))))
  (let ((browser-desktop (file-name-nondirectory name)))
    (shell-command (format "xdg-mime default %s text/html" browser-desktop))
    (shell-command (format "xdg-mime default %s application/xhtml+xml" browser-desktop))
    (shell-command (format "xdg-mime default %s application/x-extension-html" browser-desktop))
    (shell-command (format "xdg-settings set default-web-browser %s" browser-desktop))))

As a plus, it automatically lists the installed browsers based on .desktop files on your system.

Srijan Choudhary Srijan Choudhary

Looks good. I noticed some issues though:

  1. The post links in your RSS feed are incorrect.
  2. The link to lmno.lol is also incorrect on your homepage.
  3. The new RSS feed does not have GUIDs (your earlier feed had). So, in my feed reader, all your posts are showing up as unread.
Srijan Choudhary Srijan Choudhary

I had been facing an issue in #Emacs on my work Mac system: C-S-<tab> was somehow being translated to C-<tab>. I tried to look into key-translation-map to figure out the issue, but could not find anything.

Finally, turned out that I had bound C-<tab> to tab-line-switch-to-next-tab and C-<iso-lefttab> to tab-line-switch-to-prev-tab, but the actual C-S-<tab> was unbound. C-<iso-lefttab> only works on linux: something to do with how X11 sends the event to the application (and probably some compatibility mode due to which wayland was doing the same).

On Mac, once I explicitly bound C-S-<tab> in my Emacs config, it started working correctly.

Srijan Choudhary Srijan Choudhary

Read an interesting set of posts today: https://lethain.com/extract-the-kernel/ and https://lethain.com/executive-translation/ . The basic concept is:

... executives are generally directionally correct but specifically wrong, and it’s your job to understand the overarching direction without getting distracted by the narrow errors in their idea.

This resonates well with my experience. I have been doing this unconsciously, but it's good to put it in these words.

Srijan Choudhary Srijan Choudhary

Tried using X11 on #Linux the last few days due to some issues with Zoom screensharing in Wayland with the latest pipewire, and I already miss #Wayland.

Issues I faced with X11:

  1. Smooth scrolling broken
  2. Apps work noticeably slower
  3. Screen tearing
  4. This bug in Emacs GTK build: https://debbugs.gnu.org/cgi/bugreport.cgi?bug=67654 (To be fair, this is a GTK-specific issue, not X11 specific)

I will go back to Wayland as soon as Zoom fixes this: https://community.zoom.com/t5/Zoom-Meetings/share-screen-linux-wayland-broken/m-p/203624/highlight/true#M112235

Srijan Choudhary Srijan Choudhary

I have been using #karousel on #KDE for several weeks, and yesterday shifted to #PaperWM on #GNOME. Took some time to configure things like I wanted, but it's much smoother than karousel (and fancier).

Overall, I like the scrolling tiling pane paradigm. I realized I've been manually doing something like this using workspaces with 1-2 windows per workspace with two keybindings - one to change workspace and one to switch windows inside a workspace. So, this window management model really clicks for me.

I switched from GNOME to KDE several years ago due to getting burnt by extensions breaking too frequently, but hopefully things are better now.

Srijan Choudhary Srijan Choudhary

It should be compatible.

The error you're getting is Rdmtx.c:26:10: fatal error: 'dmtx.h' file not found, which makes me think that it cannot find the dmtx shared library needed for compilation. Check if that's installed for your system.

Srijan Choudhary Srijan Choudhary

#Emacs #TIL : I learned about save-interprogram-paste-before-kill - which saves the existing system clipboard text into the kill ring before replacing it. This ensures that Emacs kill operations do not irrevocably overwrite existing clipboard text.

A common workflow for me is to copy some text from a different application and paste it inside Emacs. But, if I want to first delete a word or region to replace, the deleted word or region goes to the system clipboard and replaces my copied text. This config saves the previous entry in the system clipboard so I can do a C-p after paste to choose the previous paste.

Srijan Choudhary Srijan Choudhary

It's a little costly ($15 per month or $150 per year), but I've been using Roon for this for the last few years. You can run the roon server either on MacOS or any laptop/desktop, or on a homelab server. And the mobile client app has download support and CarPlay support.

I actually use it linked to Tidal for new music discovery, and if I like something, then I buy it separately and add to my library.

You can try it out for 30 days (or use my referral link for extra 30 days free if you decide to sign up for the yearly plan).

Srijan Choudhary Srijan Choudhary

My small #emacs #orgmode #gtd customization of the day:

org-edna is a plugin that can be used to setup auto triggers (and blockers) when completing a task. org-gtd uses it to auto-forward the next TODO item in a project to NEXT when a task in the project is marked as DONE. The #orgedna trigger it uses is: relatives(forward-no-wrap todo-only 1 no-sort) todo!(NEXT).

This works okay for me, but also results in tickler tasks configured as repeated tasks to go to NEXT state instead of TODO state when they are completed. This results in them showing up in the org agenda even before they are due.

To fix this, I had to add this property to the top-level headings of the tickler file:

:PROPERTIES:
:TRIGGER: self todo!(TODO)
:END:

This overrides the global triggers configured by org-gtd for these org subtrees.

Srijan Choudhary Srijan Choudhary

Compatibility issue with indieConnector v2.1.1?

I get this error when getting an indieweb reply:

Error: Call to a member function kommentsInbox() on string
#18 /var/www/html/site/plugins/komments/utils/receiveKomment.php(14): mauricerenck\Komments\KommentReceiver::storeData
#17 /var/www/html/site/plugins/komments/components/hooks.php(28): Kirby\Cms\App::mauricerenck\Komments\{closure}
#16 [internal](0): Closure::call
#15 /var/www/html/vendor/getkirby/cms/src/Toolkit/Controller.php(60): Kirby\Toolkit\Controller::call
#14 /var/www/html/vendor/getkirby/cms/src/Cms/Event.php(139): Kirby\Cms\Event::call
#13 /var/www/html/vendor/getkirby/cms/src/Cms/App.php(1645): Kirby\Cms\App::trigger
#12 /var/www/html/site/plugins/indieconnector/lib/WebmentionReceiver.php(119): mauricerenck\IndieConnector\WebmentionReceiver::triggerWebmentionHook
#11 /var/www/html/site/plugins/indieconnector/lib/WebmentionReceiver.php(46): mauricerenck\IndieConnector\WebmentionReceiver::processWebmention
#10 /var/www/html/site/plugins/indieconnector/plugin/hooks.php(55): Kirby\Cms\App::mauricerenck\IndieConnector\{closure}
#9 [internal](0): Closure::call
#8 /var/www/html/vendor/getkirby/cms/src/Toolkit/Controller.php(60): Kirby\Toolkit\Controller::call
#7 /var/www/html/vendor/getkirby/cms/src/Cms/Event.php(139): Kirby\Cms\Event::call
#6 /var/www/html/vendor/getkirby/cms/src/Cms/App.php(1645): Kirby\Cms\App::trigger
#5 /var/www/html/site/plugins/indieconnector/plugin/routes.php(37): Kirby\Http\Route::mauricerenck\IndieConnector\{closure}
#4 [internal](0): Closure::call
#3 /var/www/html/vendor/getkirby/cms/src/Http/Router.php(120): Kirby\Http\Router::call
#2 /var/www/html/vendor/getkirby/cms/src/Cms/App.php(338): Kirby\Cms\App::call
#1 /var/www/html/vendor/getkirby/cms/src/Cms/App.php(1191): Kirby\Cms\App::render
#0 /index.php(18): null

I see a change in indieConnector v2.1.1: "webmention now sends uuid instead of page object (ee93c5d)".

To confirm, I tried it with this commit reverted, and it works.

Does komments need a new release to be compatible with indieConnector v2.1.1?

Srijan Choudhary Srijan Choudhary

Nice. I've been using a kirby plugin for micropub, but have always wanted to customize it for handling tags like you mentioned.

Note: Your last link to a note is a broken link (references localhost).

Srijan Choudhary Srijan Choudhary

Note to followers of my site using RSS feeds - I've removed the microblog replies/likes etc kind of posts from the "All Posts" feed. I feel social interaction posts like that should not be part of the default feed of my website.

There is always the notes feed that includes all microblog posts including reactions / interactions.

A list of feeds available can be found here: https://srijan.ch/feed/

#IndieWeb #Feeds

Srijan Choudhary Srijan Choudhary

I have been reading books mostly on Kindle for the last 10 years or so. Visited a nearby library today.

I didn't realize I was missing the experience of browsing shelves, stumbling upon unexpected gems, getting lost in the recommendations section, and choosing something physical to checkout.

Srijan Choudhary Srijan Choudhary

Webmention rocks tests

Redoing these tests with indieConnector v2.1.0

Discovery Tests 1-22: PASS
Discovery Test 23: FAIL
Update Test 1: PASS
Update Test 2: FAIL
Delete Test 1: Not Tested
Receiver Tests 1-2: PASS

#IndieWeb #Webmention

Srijan Choudhary Srijan Choudhary

Using sysrq on my laptop - documenting mostly for myself.

My laptop has started freezing sometimes, not sure why. Usually, I can just force power off using the power button and start it again, but it has happened twice that I had to recover the system by booting via a USB drive, chrooting, and recovering the damaged files using fsck or pacman magic.

The linux kernel has:

a β€˜magical’ key combo you can hit which the kernel will respond to regardless of whatever else it is doing, unless it is completely locked up.

(More details on archwiki and kernel doc)

To enable, I did:

echo "kernel.sysrq = 244" | sudo tee /etc/sysctl.d/sysreq.conf
sudo sysctl --system

However, to trigger this on my laptop, I was not able to find the right key combination for SysRq. I was able to make it work using an external keyboard that has a PrintScreen binding on a layer, by using the following:

Press Alt and keep it pressed for the whole sequence: PrintScreen - R - E - I - S - U - B

Currently, PrintScreen on my external keyboard is bound to Caps lock long press + Up arrow.

Srijan Choudhary Srijan Choudhary

I reviewed this recently, and found that I needed at least one device where I was logged in to 1password to be able to restore everything. So, I've started keeping a paper key with the 1password secret key so that I can restore it as well.
One addition I wanted to do was to have some kind of manual encryption in the paper key so that I'm secure as well.

Srijan Choudhary Srijan Choudhary

I can think of two reasons:

  1. You're not setting trap_exit and the process is exiting with normal reason. But it seems you're setting this.
  2. The exit message is somehow getting "eaten" by some other receive -> _ in your gen_server process.

Also, I don't think live reload should affect this. It should work across reloads.
Can you share the full code of your gen_server?

Srijan Choudhary Srijan Choudhary

Found Samuel's nice post on capturing data for org via email.

This is very close to what I was looking for to be able to do GTD capture on-the-go either from phone apps like Braintoss or from any email app.

One addition I would like to make is handling attachments in the email by downloading them and attaching to the org entry.
This would be useful for voice notes from Braintoss - it does transcription of the audio and adds it to the email body, but sometimes it doesn't work so well and I have to fall back to listening to the audio. It will also be useful for forwarded emails containing attachments.

#GTD #Emacs #OrgMode

Srijan Choudhary Srijan Choudhary

Unable to install with Kirby v4 via composer

The composer.json in the current release requires "getkirby/cms": "^3.7",, which ^4.0.0 does not satisfy.

Full error:

Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - oblik/kirby-git[1.0.0, ..., 1.1.0] require getkirby/cms ^3.3 -> found getkirby/cms[3.3.0, ..., 3.9.8] but it conflicts with your root composer.json require (^4.0.0).
    - oblik/kirby-git 1.2.0 requires getkirby/cms ^3.4 -> found getkirby/cms[3.4.0, ..., 3.9.8] but it conflicts with your root composer.json require (^4.0.0).
    - oblik/kirby-git 1.3.0 requires getkirby/cms ^3.6 -> found getkirby/cms[3.6.0, ..., 3.9.8] but it conflicts with your root composer.json require (^4.0.0).
    - oblik/kirby-git 1.4.0 requires getkirby/cms ^3.7 -> found getkirby/cms[3.7.0, ..., 3.9.8] but it conflicts with your root composer.json require (^4.0.0).
    - Root composer.json requires oblik/kirby-git * -> satisfiable by oblik/kirby-git[1.0.0, ..., 1.4.0].
Srijan Choudhary Srijan Choudhary

Keybinding to jump to first unread message

Right now, there is an unread indicator bar that can be used to manually scroll up to the first unread / last read message. It would be nice if there is a keybinding to jump directly to it as well.

Also, (related to https://todo.sr.ht/~taiite/senpai/96), when we are not at the bottom of a buffer, it would be nice to have a count of messages below it.

Srijan Choudhary Srijan Choudhary

I've been thinking about this for my site as well.
I'm mostly okay with replies being top level notes by themselves, but it would be nice to have a single page where all replies to my original post are present, including my replies to someone else's reply.

Srijan Choudhary Srijan Choudhary

New #Coffee #BlueTokai

This new packaging from BlueTokai looks nice. And the coffee tastes amazing. Chocolatey flavour with very little bitterness.

Photo of a coffee pouch with a beautiful design containing roasted coffee from Sandalwood Estate Coorg India
Srijan Choudhary Srijan Choudhary

Test webmention + fed.brid.gy:

Two naked tags walk into a bar. The bartender exclaims, "Hey, you can't come in here without microformats, this is a classy joint!"