Sign in

Abhinav 🧭

@abnv.me
70 followers 7 following 296 posts

Programming languages aficionado, occasional runner, quantified-self enthusiast, and fervent napper. Works as senior software engineer at Google on […] 🌉 bridged from ⁂ fantastic.earth/@abnv, follow @ap.brid.gy to interact

PostsRepliesMedia
Abhinav 🧭 @abnv.me · 27/09/2026
The Bends #photography #silentsunday
Photo of empty curving mountain road, with blue skies with some white and black clouds behind, a small moon also visible.
052
Abhinav 🧭 @abnv.me · 26/09/2026
Went for a #run after months. It was fun.
A photo of a field with trees around and blue sky with light clouds behind. Overlaid is the run information:

Distance 4.3km
Time 39 min
Avg Pace 9:04 min/km
031
Abhinav 🧭 @abnv.me · 22/08/2026
More than half of the traffic to my not-at-all popular website is now bots. #indieweb
A chart showing the split of traffic to my website for the past 24 hours. It reads:

Total 44.51k
Mitigated 50.62%
Served by Cloudflare 29.56%
Served by origin 19.82%
000
Abhinav 🧭 @abnv.me · 17/08/2026
Sand and Sun #photography
A photo of a sandy beach with the morning sun shining through clouds.
052
Abhinav 🧭 @abnv.me · 16/07/2026
I created a page to visualise the graph of connections within my website: abhinavsarkar.net/site-graph The result was unexpected. I didn't know I had so many internal links across pages. This is after trimming down many backlinks and navigational […] [Original post on fantastic.earth]
A force directed graph visualisation of the internal links within my website.
000
Abhinav 🧭 @abnv.me · 12/07/2026
Last day of Summer #photography #silentSunday
The Eiffel tower, photo taken from ground pointing upward, showing blue skies behind.
050
Abhinav 🧭 @abnv.me · 04/07/2026
I've started going to #drumming classes so I decided to record a session with my Garmin watch. It turned out to be an intense workout! #drummer
A chart of my heart rate over an hour of drumming. Starts from around 100 bpm and goes up to 176 bpm over the duration. Average is 139 bpm.
020
Abhinav 🧭 @abnv.me · 20/05/2026
The bends #photography
Photo of a tall office building taken close to it from the ground looking upward, with cloudy skies above.
0104
Abhinav 🧭 @abnv.me · 06/05/2026
They say that every language becomes incomprehensible to the readers over a thousand years, but I think this would make no sense to someone from merely a hundred years ago.
screenshot of an article title:

Grok AI unofficial crypto wallet hacked with an NFT and a prompt injection
414
Abhinav 🧭 @abnv.me · 26/04/2026
Asia ➤ Moon #photography #nightPhotography #silentSunday
Photo of an airplane's tail wing with "Asia" on it pointing to the moon in the night sky.
071
Abhinav 🧭 @abnv.me · 17/02/2026
My #FeedReader tells me that I've read/skimmed over forty-two thousand posts via #feeds this year. Feeds are not dead. #RSS
A screenshot of the Miniflux feed reader history page, showing the number of posts read, which is 42864.
000
Abhinav 🧭 @abnv.me · 31/01/2026
Boated #photography
photo of a lone boat sitting on a sea shore.
071
Abhinav 🧭 @abnv.me · 26/01/2026
Supernova! #photography
photo of some tree tops in fog, looking like a celestial event
052
Abhinav 🧭 @abnv.me · 22/01/2026
Dry is the limit #photography #sky
photo of a dead try stump against the blue sky with some clouds
021
Abhinav 🧭 @abnv.me · 21/01/2026
Blue as Sky #photography #sky
photo of a bright blue sky with some tree branches in a corner
022
Abhinav 🧭 @abnv.me · 20/01/2026
Orion's glow #photography #nightphotography #stars
photo of the night sky with the Orion constellation visible behind the leaves of a dimly lit tree
042
Abhinav 🧭 @abnv.me · 11/01/2026
All that remains #photography #silentsunday
photo of a lake with some trees in its middle.
092
Abhinav 🧭 @abnv.me · 23/12/2025
Heading #photography
photo of a long corridor with no doors
081
Abhinav 🧭 @abnv.me · 14/12/2025
Lone flyer #photography #sky #silentsunday
photo of a lone kite flying against the blue sky
022
Abhinav 🧭 @abnv.me · 09/12/2025
Added links to similar and dissimilar posts to the blog posts on my website. Used the TF-IDF algorithm and wrote everything from scratch in my bespoke static site generator. It works well enough, but now it uses twice as much memory. #indieweb #blogging #ssg
A screenshot showing lists of similar and dissimilar posts.
001
Abhinav 🧭 @abnv.me · 03/12/2025
True Blue #photography #sky A really bright evening in #Bangalore today. I had to take a photo.
photo of a blue sky with scattered golden and grey clouds
022
Abhinav 🧭 @abnv.me · 01/12/2025
Starting my new life as a milk intolerant person with this cup of lemon tea. #personal
photo of a tall white cup containing lemon tea, sitting on a wooden table.
130
Abhinav 🧭 @abnv.me · 28/11/2025
Skies scrapped #photography
A tall skyscraper
073
Abhinav 🧭 @abnv.me · 26/11/2025
#Sky dragon #photography
A long narrow cloud against the blue sky. Looks kind of like a dragon.
091
Abhinav 🧭 @abnv.me · 23/11/2025
Over the mountain #photography #silentsunday
photo of a mountain peak surrounded by clouds, with blue skies above.
042
Abhinav 🧭 @abnv.me · 15/11/2025
Gave my aging #MechanicalKeyboard a makeover by changing keycaps. The mix of colors looks pretty cool.
photo of a mechanical keyboard with white, black, light and dark green keycaps.
021
Abhinav 🧭 @abnv.me · 15/11/2025
An earnest #sunset #photography
silhouette of a couple against the evening sky, standing in an open field watching the sunset.
072
Abhinav 🧭 @abnv.me · 02/11/2025
Right time #photography #silentsunday
photo of the blue sky above branches of a tree
042
Abhinav 🧭 @abnv.me · 11/10/2025
The baby woke us super early today, and we saw this super #rainbow at sunrise! #photography
A large rainbow seen at sunrise.
021
Abhinav 🧭 @abnv.me · 07/10/2025
Where are the controls for this game? #photography
photo of a wall mural that is the dinosaur game you can play in Google Chrome browser at chrome://dino
024
Abhinav 🧭 @abnv.me · 28/09/2025
Wrote some JavaScript code to customize #Miniflux #feedReader to automatically sort articles by similarity. Now I can read similar articles one after another easily.
A screenshot of Miniflux feed reader showing articles sorted by similarity.
002
Abhinav 🧭 @abnv.me · 25/09/2025
The irony!
A screenshot of my Miniflux feed reader showing that the feed for the Open RSS openrss.org website is inaccessible. The error message says: "Access to this website is forbidden. Perhaps, this website has a bot protection mechanism?"
000
Abhinav 🧭 @abnv.me · 27/07/2025
I've got to learn this "weird French programming language that no other company uses" used by this one company named Jane Street so that no other companies will hire their employees. #ocaml
Screenshot of a YouTube video that claims that Jane Street uses "a weird French programming language that no other company uses" so that no other companies will hire their employees.
033
Abhinav 🧭 @abnv.me · 25/07/2025
stic.earth is a collection of privacy-respecting, self-hosted applications and services, which includes fantastic.earth, my server. It currently runs these services: - #Mastodon (Microblogging) - #Pixelfed (Image posting) - #Bookwyrm (Book […] [Original post on fantastic.earth]
A screenshot showing the list of services offered by stic.earth.
010
Abhinav 🧭 @abnv.me · 12/06/2025
Completed my double trio of #MechanicalKeyboards: from top to bottom: brown, red and blue keys; small, medium and large layouts; Ducky mini one, Keychron K2 and Filco majestouch.
photo of three mechanical keyboards taken from the top.

from top to bottom: brown, red and blue keys; small, medium and large layouts.
011
Abhinav 🧭 @abnv.me · 05/06/2025
SOMEBODY STOP ME! #mechanicalKeyboards
Photo of a many mechanical keyboard kept in two lines on a bench, taken in a keyboard shop.
332
Abhinav 🧭 @abnv.me · 01/06/2025
#nixos ruins another relationship
Screenshot of a Reddit post:

r/AmIOverreacting
Mundane-Rooster-7286
AIO. My bf developed an addiction ❄️ and I’m considering leaving
221
Abhinav 🧭 @abnv.me · 28/05/2025
It is a good day to unleash the agent of chaos. #Haskell #programming
Screenshot of the documentation of the Haskell function accursedUnutterablePerformIO:

accursedUnutterablePerformIO :: IO a -> a

This "function" has a superficial similarity to unsafePerformIO but it is in fact a malevolent agent of chaos. It unpicks the seams of reality (and the IO monad) so that the normal rules no longer apply. It lulls you into thinking it is reasonable, but when you are not looking it stabs you in the back and aliases all of your mutable buffers. The carcass of many a seasoned Haskell programmer lie strewn at its feet.

Witness the trail of destruction:

    https://github.com/haskell/bytestring/commit/71c4b438c675aa360c79d79acc9a491e7bbc26e7
    https://github.com/haskell/bytestring/commit/210c656390ae617d9ee3b8bcff5c88dd17cef8da
    https://github.com/haskell/aeson/commit/720b857e2e0acf2edc4f5512f2b217a89449a89d
    https://ghc.haskell.org/trac/ghc/ticket/3486
    https://ghc.haskell.org/trac/ghc/ticket/3487
    https://ghc.haskell.org/trac/ghc/ticket/7270
    https://gitlab.haskell.org/ghc/ghc/-/issues/22204

Do not talk about "safe"! You do not know what is safe!

Yield not to its blasphemous call! Flee traveller! Flee or you will be corrupted and devoured!
024
Abhinav 🧭 @abnv.me · 23/05/2025
#Pocket is dying so it's appropriate to talk about the minimal #ReadLater service I wrote for myself: LinkFodder. You can save links via an API, or a form, or a Telegram bot, and you get an HTML page (shown below) and an Atom #feed. That’s it. Supports […] [Original post on fantastic.earth]
Screenshot of Linkfodder page for me. Shows number of links saved, time for last update, and two latest links. Also shows a form to save URLs, and a link to a feed of links.
001
Abhinav 🧭 @abnv.me · 06/04/2025
When you delete the deprecated function but forget to removed the deprecation comment: #signs #programming #meme
photo of a notice pasted on a wall above where a now removed urinal used to be:

Notice
Not in use
000
Abhinav 🧭 @abnv.me · 27/02/2025
This is my 500th original post on #Fediverse 🎉 I've been on #Mastodon for 2 years, 3 months, and 16 days now, and I love it here! To celebrate this occasion, I've created a pie chart of the #hashtags I've used in my posts (with at least two occurances) […] [Original post on fantastic.earth]
A pie chart of tags. Top ten tags are:

programming
haskell
mastodon
nixos
adventofcode
blog
functionalprogramming
running
programminglanguages
nix
000
Abhinav 🧭 @abnv.me · 22/02/2025
Comparing the chart of Monad tutorials by year[1] with the Gartner hype cycle graph, it seems like we are almost at the Peak of Inflated Expectations now. 1]: From the list of Monad tutorials ([wiki.haskell.org/Monad_tutorials_ti…). In my […] [Original post on fantastic.earth]
A line chart showing number of Monad tutorials published yearly from 1990 to 2023. The number grows slowly at the beginning, then rises sharply starting 2015, then seems to plateau around 2022.The graph of the Gartner Hype Cycle.
000
Abhinav 🧭 @abnv.me · 10/02/2025
fantastic.earth is growing, literally. After running on a small 4 GB server for two years, we have recently migrated to a 64 GB server. Now we can host even more services for our members. We currently run these services: - #Mastodon (Microblogging) […] [Original post on fantastic.earth]
A table showing data received and sent yearly by the fantastic.earth server for 2022–25:

year                           rx                              tx                      total
2022                         351.55 GiB            75.60 GiB      427.15 GiB
2023                         5.93 TiB                 6.99 TiB         12.92 TiB
2024                         5.81 TiB                  8.07 TiB         13.88 TiB
2025                         536.84 GiB           1.06 TiB          1.59 TiB
2025 estimated     5.72 TiB                  11.62 TiB        17.34 TiB
021
Abhinav 🧭 @abnv.me · 25/01/2025
After seven years of meticulously formatting and aligning all the source code of my #Haskell static site generator by hand, I finally moved to an auto-formatter today (Ormolu).
Screenshot of the summary of a git commit that says:

Reformats Haskell code
66 changed files with 3201 additions and 2845 deletions
000
Abhinav 🧭 @abnv.me · 05/01/2025
I analysed the #Mastodon posts I've made over the last 2+ years for the clients I've been using, and created some charts. The first one is the pie chart of the post count by clients. @ivory for Mac is the winner here, with 30% posts made using it. @phanpy […] [Original post on fantastic.earth]
pie chart of the post count by Mastodon clientsthe Mastodon post count split by clients over time
001
Abhinav 🧭 @abnv.me · 04/01/2025
I have been using #Miniflux as my feed reader for a couple of years now. It is intentionally minimalistic, and hence it lacks certain features. One thing that I sorely miss is the capability to sort the feed entries by various criteria like entry reading […] [Original post on fantastic.earth]
Screenshot of the customized Miniflux reader web app showing a dropdown of sorting options
001
Abhinav 🧭 @abnv.me · 21/12/2024
I've completed Part One of "Warehouse Woes" - Day 15 - Advent of Code 2024 #AdventOfCode adventofcode.com/2024/day/15. See my #Haskell solution at github.com/abhin4v/AoC24/blob/main/…. It was fun to visualize the bot movement […] [Original post on fantastic.earth]
052
Abhinav 🧭 @abnv.me · 19/12/2024
[Discussion of the solution OR A tale of two Tries] The solution is just 10 lines of code. As many others would have, I solved the first part using regular expressions. But the second part requires us to enumerate all possibles matches, and regular […] [Original post on fantastic.earth]
Haskell code:

main :: IO ()
main = AoC.main solvePart1 solvePart2 $ \input ->
  let (stripes : _ : patterns) = lines input
   in (BS.pack stripes & BS.split ',' & map (BS.strip >>> (,())) & Trie.fromList, patterns)
  where
    solvePart1 (t, patterns) = patterns & filter (countCombs t >>> (/= 0)) & length
    solvePart2 (t, patterns) = patterns & map (countCombs t) & sum
    countCombs t = memoFix $ \f pattern -> case pattern of
      [] -> 1
      _ -> pattern & BS.pack & Trie.matches t & map (thd3 >>> BS.unpack >>> f) & sum
001
Abhinav 🧭 @abnv.me · 14/12/2024
[Discussion of the solution] I initially thought that I could solve this day with AStar search algorithm, and I did use it to solve the first part. However, it was too slow for the second part, the goal being just too far. Fortunately, the linear library […] [Original post on fantastic.earth]
Haskell code:

main :: IO ()
main = AoC.main solvePart1 solvePart2 parse
  where
    solvePart1 = sum . mapMaybe solveAStar
    solvePart2 =
      sum . mapMaybe (solveLinear . (\(Machine a b p) -> Machine a b (p + 10000000000000)))

data Machine = Machine !(V2 Integer) !(V2 Integer) !(V2 Integer)
  deriving (Show)

parse :: String -> [Machine]
parse input = case P.readP_to_S (P.sepBy1 machine newline <* P.eof) input of
  [(parsed, "")] -> parsed
  xs -> error $ "No parse: " <> show xs
  where
    machine = Machine <$> (move 'A' <* newline) <*> (move 'B' <* newline) <*> (prize <* newline)
    move c =
      V2
        <$> (P.string "Button " *> P.char c *> P.string ": X+" *> digits)
        <*> (P.string ", Y+" *> digits)
    prize = V2 <$> (P.string "Prize: X=" *> digits <* P.string ", Y=") <*> digits
    digits = read <$> P.readS_to_P lexDigits
    newline = P.char '\n'

solveAStar :: Machine -> Maybe Int
solveAStar (Machine a b prize) = fmap fst . flip (astar (V2 0 0) prize) (const 400) $ \cur ->
  if cur < prize then [(cur + a, 3), (cur + b, 1)] else []

solveLinear :: Machine -> Maybe Int
solveLinear (Machine a b prize) =
  let V2 (V1 aMoves) (V1 bMoves) =
        inv22 (transpose $ fmap fromIntegral <$> V2 a b) !*! transpose (V1 $ fromIntegral <$> prize)
   in if isPositiveInteger aMoves && isPositiveInteger bMoves
        then Just $ round $ 3 * aMoves + bMoves
        else Nothing
  where
    isPositiveInteger x = x > 0 && denominator (approxRational x 0.0001) == 1
000
Abhinav 🧭 @abnv.me · 10/12/2024
[Today's solution] Short one, using unfoldForest and levels from Data.Tree.
Haskell code:

main :: IO ()
main = AoC.main solvePart1 solvePart2 parse
  where
    solvePart1 = pathsToTop >>> map (ordNub >>> length) >>> sum
    solvePart2 = pathsToTop >>> map length >>> sum

    parse =
      lines
        >>> zip [0 ..]
        >>> map (\(i, row) -> zipWith (\j c -> ((j, i), digitToInt c)) [0 ..] row)
        >>> (\rows -> (Map.fromList $ concat rows, length (head rows), length rows))

    pathsToTop (grid, width, height) =
      Map.assocs grid
        & filter ((== 0) . snd)
        & Tree.unfoldForest (id &&& nexts)
        & map (Tree.levels >>> (!! 9))
      where
        nexts ((x, y), alt) =
          [ (point', alt')
            | (x', y') <- [(x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)],
              x' >= 0 && x' < width && y' >= 0 && y' < height,
              let point' = (x', y'); alt' = grid Map.! point',
              alt' == alt + 1
          ]
000