I have been mapping addresses on OpenStreetMap since a long time. During this time I have been also frequently referring to the wiki page for guidance whenever I felt my method was wrong. This post is the result of all the stupid mistakes I found during this checking of wiki. I hope that others wouldn’t make those same stupid mistakes.
Though this post is based on my experience in India, it should be useful to people elsewhere in the world.
The mapping process looks like this:
Check if the neighbourhood or the street is present on the map. If it’s not, then add it.
Create the building if it’s not on the map. Then add addr:street (or addr:place) and addr:housenumber (or addr:housename) to the building depending on the address.
That’s it. Now let’s elaborate on some things.
Point (1) is not something which is mentioned frequently but which is needed if you want to use your addresses in apps like OsmAnd in a proper fashion. So, start adding those name to the roads and start creating label for your neighbourhoods!
The address should be always attached to the building instead of the shop/office/etc residing inside that building. This keeps the building nice and steady even as the things inside it keep changing. The address should be on only one feature, that is building. Use addr:unit to specify the address of different things inside the building. Ensure that the things are placed inside the building.
This one’s obvious but please don’t add the name of the place in addr:street.
The addr:place can contain anything that is written just after the housenumber or housename. It’s even OK to use things like “WZ Block” or “Pocket 5.” Just ensure there’s a proper hierarchy of places. In “156, Pocket 9, Sector 41, Dwarka, Delhi” for instance “Pocket 9” should go in addr:place, while Sector 41 should go in addr:suburb and Dwarka will go in addr:quarter. These last two can be ignored while actual mapping since they can be inferred from the data.
The addr:housenumber should contain the whole identifier that is used to locate the building. Something like “WZ-156/2A” is totally a valid identifier. It has been argued that since “WZ” is a block it should instead go in addr:block. I usually disagree with this sentiment since blocks in the Indian context refer more to a random group of houses instead of a proper city block. If one actually wants to separate the “WZ” part they should instead add something like “WZ Block” to addr:place. Even in that case the identifier should remain unchanged.
Also one should only use addr:street or addr:place in an address but not both. A lot of roads in Delhi have names that aren’t actually used by the locals. So, use addr:street only if it is used more often then the name of the neighbourhood. Similarly, one should only use addr:housename or addr:housenumber but not both.
When you are done, try looking up the street or neighbourhood on OsmAnd and be ready to be pleased with a nice list of all the addresses under that head.
We are back in Bengaluru. We drove back on Sunday, so traffic would be light since it was in the middle of the long weekend. The drive was comfortable. We took three breaks, primarily for me and Echo to stretch.
Buddha
Back from a slow Deepavali weekend, work is getting hectic as we approach the end of the year. According to my estimates, it’s going to be a hectic couple of months at work. I am preparing myself.
🪔 Happy Deepavali! May good thoughts and bright moments light up your life.
ğŸ�‹ I went back to Stairs Physiotherapy and Fitness this week. During the break, I took some online sessions and some on my own. I am happy that I didn’t stop. Given how the rest of the year is going to be, I think this is a must. I am also enjoying the challenge and progress.
💬 My migration to the XMPP network is going well. Even though there are fewer personal contacts there, I have enough groups/channels that I am spending more time there. On mobile, I use Snikket/Cheogram as the client. On Linux Desktop, I use Dino. It works well. My next step would be to write a simple bot using Slixmpp or aioxmpp.
💻 For a long time, I had this idea of building a “buy me coffee” kind of service for myself, with some return gifts. But I don’t want to get a merchant account. I wanted to use my existing UPI. This week, I built a PoC with UPI and no external dependencies. It works. I plan to implement that on this site sometime. I will keep you informed.
🤖 If you haven’t noticed, I have an “Assisted by AI 🤖” tag to indicate which posts were assisted by AI in writing, coding, etc. I mention the model names and sometimes even the prompts when it makes sense. I try to use AI thoughtfully, avoiding slop.
💻 Interestingly, NSDL’s CAS monthly holding reports now value equities by face value rather than market value (as they did until August/2025). That change makes it hard to track portfolio variations. I am not sure if it’s intentional or just a mistake. If you have scripts based on this, you may want to update them.
ğŸŒ� If you have time, read this conversation with Ted Chang titled Life Is More Than an Engineering Problem. I kind of agree with him. Another helpful post to read this week is Ben Werdmuller’s advice to technologists on using technology skills for positive change. At this point, given that both India and the USA are at the same level. Everything he says there also applies to technologists in India. Talking about politics and tech, data seems to be vanishing from government sites. It has happened before in India as well. There are efforts to archive them in a distributed way. Sciop is an experimental federated BitTorrent tracker designed for survivability. The project looks useful and is already archiving datasets from USA. It’s different from archive.org as it’s a distributed system. In the good news category, Gubbi Labs released long-term frog observation data based on their annual Bisle Frog Watches. I love citizen science projects. Hopefully, I can participate one day.
You can read this blog using RSS Feed. But if you are the person who loves getting emails, then you can join my readers by signing up.
If you are a tiny business wo/man, there are literally no easy payment products to sell online. They all need registration, KYC, complex setups, etc. This is even when you have a valid bank account. There are also platform and transaction fees.
In such scenarios, I see most people receive money on UPI apps like Google Pay or BHIM and ask you to send a screenshot of the transaction once the payment is complete so they can reconcile it. I think it works for most people. Ideally, even though only the UTR/Transaction ID is enough to map it, it’s not easy for the sender to send it. Most apps make it difficult to copy, too.
So I was wondering if we could include additional information in the transaction to make confirmation/reconciliation easier for small-time business folks. I was not looking for a real-time payment confirmation, as it is not needed by many. They can log in to the bank account, confirm the payment, and accept the order.
The flow would be. The customer creates a cart, checks out (final amount), a UPI QR code is displayed, and he pays. Then they submit the order by indicating that payment is complete1.
A small business person receives the order, opens the bank app, checks the payment, and marks the order as accepted if the payment is complete; otherwise, they reject the order. This flow works without effort if there are only a few orders a day. Let’s say there are ten or fifteen valid orders and another ten invalid orders. Then it becomes difficult for the merchant to confirm.
So I was wondering: if the transaction details the bank receives and displays to the merchant include the order_id (or the customer’s mobile_number) for which the payment is made. Then the merchant can just compare order_id and amount against the received and confirm the order. Most banks allow you to download a transaction statement in CSV or PDF format. You can script to read it and confirm the orders once a day. I know it’s not real-time. But I am thinking about slow commerce and not quick commerce.
One can easily generate a QR code for their UPI ID that apps can use to send payments. It’s a simple link inside the QR code that makes it possible. In the link parameters, you can specify the amount (am), currency (cu), receiver’s UPI ID (pa), Receivers Name (pn) etc.
There is also a field called tn. I think it’s called transaction notes or remarks. It’s what you see in UPI Apps as remarks/note/comments, etc. The interesting thing to note is that it appears in the receiver’s bank statement. Each app allows a different note length, and some also allow special characters. But I have found 10-digit alphanumeric to be safe. It’s allowed by almost all apps. It appears clearly in the bank statement of the receiver. Now we can use it creatively.
We can use it to send order_id, customer_id, or mobile_number if you are building a simple, homemade shopping cart payment system. I wish the regular bank accounts had API access. But for now, EoD, you can export the transactions as PDF or CSV and map them.
This is how the UPI transaction looks in bank statement. Here you can see that the “qwert12345” highlighted in red is what I sent as tn as my order_id.
Above is the screenshot of bank statement. In that case I sent string qwert12345 as tn and hence that appears in my statement.
I built a small dummy demo using Claude. In the video demo below I sent a dummy customer mobile number 9945299452 as the tn and hence that would appear in my bank transaction statement.
You can read this blog using RSS Feed. But if you are the person who loves getting emails, then you can join my readers by signing up.
We spent the birthday weekend at Kumarakom. It was a slow and lazy weekend. It reminded me of a similar slow and lazy birthday weekend thirteen years back. Time does fly fast.
Institute of Advanced Study in Education.
pin:680020 geo:10.52753,76.21818
Back to daily programming starting Thursday, though I tried to catch up on the essential things by spending about 60 minutes a day. A week’s absence means a lot of catching up. So the rest of the week was hectic.
I sent postcards to friends and family from Kumarakom. India Post has started delivering, and some of them have already received it. I have sent another batch of postcards from Thrissur. I had this plan of sending custom postcards a long time back. This is the first step towards it: a card of Pink Flowers in Bengaluru, painted by Shalini. I want the next one to have a poem that the receiver can enjoy. I have a ton of poems to pick from; it’s going to be a challenge.
I also continued to map postboxes and visiting new cafes in Thrissur this week.
I added a minor feature where I tag the posts by Week Number, so one person (mostly me) can explore all the posts from WN-41 (4 posts for 4 years). At some point, I want to add a side widget to show all the posts from this week for the last few years.
Most people think FOSS is free of politics, but fail to understand that the birth of Free Software is due to politics. It’s the politics where the user of the software is at the center. Without politics, it’s just software with code available.
Even in big democracies, you have freedom of speech only if you belong to the majority by Religion, Caste, Race, Language, etc., and numbers do not always define the majority. If you are a minority, you don’t have it. What the law says doesn’t matter as the *majority* thinks otherwise.
Boulangerie Art Cafe by – Chakola’s Hospitality
The Lilly’s at Thrissur
You can read this blog using RSS Feed. But if you are the person who loves getting emails, then you can join my readers by signing up.
Vembanad Lake is one of the longest lakes in India and the largest in Kerala. It touches three districts in Kerala. So when we thought of exploring Kerala, we wanted to start with nature, and backwaters were the first thing that came to mind, besides beaches. We chose Kumarakom as it seemed to have nicer places to stay. Maybe next time we can stay in Alleppey.
We left early to avoid traffic. The drive from Thrissur to Kumarakom is not long, but it takes time. We also took a slight diversion and visited Fort Kochi for breakfast. I wanted to see a couple of cafes in Fort Kochi, but we spent all our time at Lila Art Cafe. I liked the location, food, and ambience. The idea was just to have coffee, but we all ate a heavy breakfast. I also took some pictures of the post office next to it and did some mapping.
Lila Art Cafe at Fort Kochi
gps:9.96559,76.24130 pin:682001gps:9.96559,76.24130 pin:682001Fort Kochi Head PO
We reached Kumarakom by lunchtime, checked in, and spent the evening walking around within the Taj, Kumarakom Resort. Taj shares the boundary wall with the Vembanad Lake. You can watch the sunset or the houseboats from there. The property is also big enough for toddlers to walk and run around, and it is beautiful.
Lake inside Taj KumarakomBaker’s Bungalow at Taj Kumarakom. Its a heritage building. Inside Baker’s Bungalow at Taj Kumarakom. Its a heritage building. View from Inside Baker’s Bungalow at Taj Kumarakom. Its a heritage building. Main heritage building at Taj Kumarakom
The next day, we had plans to visit the bird sanctuary and take a ride in the houseboat. But the bird sanctuary is closed for maintenance. So we woke up late and had a lazy, long breakfast. Uma walked around the property quite a bit, talking to everyone she met. I also found a post office nearby to post the cards and add them to the OpenPostboxIndia project.
We took the houseboat around 2 PM to go around the lake for the next four hours. Folks on the boat also served a very good sadhya with fish and meat. Uma seemed a bit scared by the “big water” at first, but then she calmed down. We spend most of the time watching things or looking for birds and other things. I also got a cake.
You can see Alleppy from Houseboats in Vembanad lake.Thanneermukkom Bund, Vembanad lake. Uma watching houseboats in Vembanad lake.Uma watching boats in Vembanad lake.Houseboats in Vembanad lake.
We came back by 6, had dinner, and then went to bed early after spending some time at the resort’s lake. We initially planned to visit water lilies, but we woke up late and had a lazy, long breakfast. Then drove to Kottayam to see some old churches. We did that and then drove back to Thrissur.
I used to be amazed at depressed people talking about heartbreaks with intense passion. It can’t be that bad, right? That person might used to be very important to you, but surely you can easily overcome the sadness and move on to the next part of your life? The whole affair appeared simple.
And with those ideas I entered my college. I was never very popular at the school, though I had plenty of chances. It was mostly due to my poor communication skills; for an outsider, I must have looked like a mild case of “Komi Can’t Communicate.” So, I wasn’t expecting much for my new college life. My low expectations served me right as the first year passed quickly; I was friendless.
In the second year, however, I suddenly found myself with a close friend. I can’t remember how it started; I probably must have initiated by challenging her for a game of chess, since I had zero idea about the kind of stuff “normal people” usually talk about. Soon we slowly, or maybe suddenly, started talking a lot on WhatsApp. (Sorry. I wasn’t very knowledgeable about XMPP at that time.) I have no memory of these chats. What in the world could we have been possibly be talking about?
At some point out of time, I suddenly found myself debating with her on abortion. She turned out to be an anti-abortionist. (Ugh.) Unfortunately, She eventually “won” the debate. I explained it away as a temporary disorder in the sequence of my logic, but the experience was pleasurable nevertheless. We started debating more, and we started playing online games. It was going good. (There were occasional fights, but it was mostly me acting hurt to gain her sympathy or make her feel bad. Not nice.)
A few weeks later the exam started. It wouldn’t have been a good idea to continue our daily conversations at that time, so we ceased it more or less for our preparations. This was too much for me. I lost my supply of dopamine; and in its absence I started compiling a history of our past conversations. (I have zero idea why I did that.) I later showed it to her, which was a bad idea. She didn’t say much, but her disapproval was evident. I must have seemed kind of creepy.
Well anyway, we continued doing our thing once exams were over. But something was amiss. Things were omitted. Suspicion. It felt like she was trying to push me away. My frustration suddenly bursted one day when we were talking about Astrology. She believed in horoscopes and stuff. (The youth, minus me, these days!) My anger boiled over. Then her anger boiled over. End.
Surely the fight was just a blip and not complete destruction of the relationship? Weeks passed. Nothing happened. Months. Nothing. I wasn’t able to make new friends. So in the free time I started going back to OpenStreetMap and chess. My adventure into chess failed, with me losing some 20 FIDE elo points (which, for people who are unaware, is a lot). I got bored of OpenStreetMap a few weeks ago. I have started watching romances and comedies in Anime, and I will get bored of that too. On the other hand, I have started paying more attention to my education; I want to go to Japan in future.
A weak attempt at reconciliation was made by both of us sometime ago, but it failed badly because it is impossible for 2 young adults to communicate there emotions freely.
Meanwhile, each day at the college is very painful. A single glance, nay, even a whisper still excites me enough to imagine her coming back to me. I still keep thinking of her in the college. The home is the only respite from this torment. I want to get away from this college. I hate it. Breakup, even with just a friend, does hurt a lot.
So, here I am, broken yet hopeful for the future. Why am I writing this now? I didn’t want to disturb the process of reconciliation then, if there was even a minute chance of that. And why am I writing this here? Because there’s no where else to write this.
This year, I wanted to celebrate for no real reason at all. At first, I wanted to get friends together and celebrate with a meal, but then it seemed like a lot of organizing, and so many of them are away. So I choose to spend time with Uma and Anju. I chose Taj, Kumarakom, because we were going to be in Kerala, and we could have grandparents take care of Pathu and Echo :) Also, we have not traveled together much in Kerala. It’s prettier than I thought.
Uma
I wanted to say thanks to all who are involved in my life (that’s why the meal was planned). I asked Shalini, a friend, to do a watercolor painting of a picture that I had taken in Bengaluru. She did a fantastic job of it. I converted it into a postcard. I sent about 30 of them today. I do have another 20 to go. I will probably send them in the next couple of days. I hope they reach you.
Postcard designed by Shalini
I will do a second print. If you like this card or, in general, like getting postcards. Enter the address here. I will send one as part of the second print.
Postcards ready to go
Here is my graph for the current year. It’s a bit different than last year. In general, I am happy, very grateful to things and people I have in life and want to do many things in the coming year.
Lots and lots of love.
You can read this blog using RSS Feed. But if you are the person who loves getting emails, then you can join my readers by signing up.
The first half of the week was hectic. I am taking a week off from work (Wed to Wed), so the work week was busy as I tried to close as many loops as possible. The idea is to spend time with family in Thrissur; otherwise, Uma has holidays and gets to enjoy them, leaving me feeling left out.
But First Coffee, La’CUOCO at Thrisur
Also, travel a bit in Kerala. Anju and I have not spent time traveling in Kerala. Even though we come at least twice a year and spend months here, we never get out. We are planning to change that.
Occasionally, I send a ton of postcards to friends and readers from around the world. If you like to receive a postcard, you can leave your details here.
A friend of ours has started Kutty Jetty, an online D2C store for toddler clothes. They are very pretty and comfortable. I wish I could buy some for myself. Anyway, I got one for Uma.
My parents weren’t scientists, but they did instill a scientific temper in me. One doesn’t have to be a scientist to wonder and question, or to teach others to do the same.
I have been eating healthy. I have not entirely cut down on snacks or treats. I do eat them, but it’s well managed. I have reduced from 63 to 61KG. The goal is to be just under 60, which is the ideal weight. Finally gave in and got a protein shaker bottle from Hacker Athletics. It’s made of stainless steel with a powder coating and has a screw or twist-off lid. It has everything I wanted. It’s yet to arrive. I will let you know if it’s as good as it’s advertised.
Just a reminder to everyone here: I am slowly transitioning my messaging to XMPP. It’s thej@chat.thejeshgn.com. Hopefully, in the next three to four years (it does take time), I can move entirely to XMPP.
I am not sure if I have shared this page about coffee meetups. I do try to meet folks (readers and others) when we happen to be in the same city. Usually, someone emails me or I email them to initiate when this occurs. I thought it made sense to make the rules of engagement public.
For the first time, I heard Kuvempu refer to himself not as a Hindu, but as Vishwa Manava (Universal Man) in an Akashavaani interview extract. I listened to it multiple times to ensure I understood what he meant. Then I took some time to transcribe it for the larger audience. He thinks Hinduism can grow only by getting rid of the caste and varna system, which is what Ambedkar (though more radical) also spoke about in his undelivered speech in 1936, Annihilation of Caste. In which he suggests that there is no Hindu religion without the Varna/Caste system, and hence annihilation of the caste system is actually getting rid of the Hindu religion. Unfortunately for Hinduism in India, it couldn’t get rid of the caste and varna system in any sense, even decades after Independence, and lost Ambedkar to Buddhism (October 14, 1956). And his declaration (October 13, 1935), “I will not die as a person who calls himself a Hindu”, came true.
I plan to try out new cafes in Thrissur this time. I tried La’CUOCO this week. They have good coffee and food. Added them to OSM as well.
I started reading Demon-Haunted World : Sagan, Carl, Druyan, Ann. It’s about cultivating a scientific temper, promoting critical thinking, and fostering skepticism. One paragraph in the preface made me think about my parents and thousands of others as well. You don’t have to be a scientist to have a scientific temper or to instill it in your kids.
My parents were not scientists. They knew almost nothing about science. But in introducing me simultaneously to scepticism and to wonder, they taught me the two uneasily cohabiting modes of thought that are central to the scientific method. They were only one step out of poverty. But when 1 announced that 1 wanted to be an astronomer, 1 received unqualified support – even if they (as 1) had only the most rudimentary idea of what an astronomer does. They never suggested that, all things considered, it might be better to be a doctor or a lawyer.
Given AI and all the myths surrounding it, and that it brings to this world. I believe that homes and schools need to focus more on fostering a scientific temper, critical thinking, and skepticism. Without them, I think the future will be drowned in slop. It was always important, but it is even more so now. No wonder it gets a mention in the Indian Constitution.
Going back to the quote. Both skepticism and wonder are essential. Wonder keeps us reaching; skepticism keeps us real. Together, they define what it means to think. Human brains are evolved enough to handle both at the same time. It can be taught. It makes us human.
You can read this blog using RSS Feed. But if you are the person who loves getting emails, then you can join my readers by signing up.
A few months ago I travelled to Darbhanga district of Bihar. This post draws from 3 of the places I visited during my journey: a poor village, a lower-middle class village, and a lower-middle class part of the city.
Agriculture
All crops have been destroyed due to low rainfall which has been appropriately labelled by one villager as “God’s Piss.” The fields are now full of weeds. Some desperate farmers have planted more plants, only for them to be burnt again. Other farmers with more money have used it to plant mango tress, which will only give fruits after many years. Another class of farmers have sold their fields to brickyards, whose owners are locally known as “Sand Mafias.” The selling of field gives the household a lot of money, but it is very likely that those funds would be exhausted soon and the farmer would end up landless. After the brickyard is done with the field, the empty hole turns into a pond. Nearby fields are now gradually getting destroyed as their sand is now falling in the pond. Some fields have already been destroyed like this. The ponds are also a hotspot for defecation.
Mini-forests are also common in the village, with an average family owning around 5 tress. The village I visited mostly contained mango tress and bamboo. The bamboo is used for constructing homes, and the villagers are careful to give the grass (bamboo is a grass) enough time to regenerate. It is easy to travel in the forest due to its low density.
Agriculture is mostly limited to self subsistence. Crops are usually consumed by the villagers, but a large part is sent to the family members living in the city. These people working in the city are usually males who are barely able to survive on their daily wages. However, due to crop failures this year, the trend has been reversed with people in city sending money to their families in the village.
Education
Thankfully, girls are now also being sent to schools. Households have enough funds to send all of their children. However, girls still face heavy discrimination. They have to do all of the usual household chores, while boys laze around and play games. The talks of marriage start as soon as they are 18, sometimes even before that. One girl who I talked to in the village told me how she is facing pressures from the family when she hasn’t even finished her bachelors. However, I was able to see some positive impact of Indian serials on gender roles.
The situation is quite different in the city. One can see couples wearing expensive clothes in the universities. The students seem very progressive on most ideas and they were speaking very fluent Hindi with little accent. This was quite a shock to me, as I wasn’t expecting such a high level of westernization in Darbhanga. I think it would be quite impossible for me to distinguish these people from the normal batch of students I meet in Delhi.
City
Like most Indian cities, there is significant urban sprawl. I suspect a legal ceiling on building height, since I didn’t saw any buildings higher than 5 floors. The city is highly dependent on private vehicles for transportation, due to virtual absence of public transport.
The houses are made of bricks and coloured with light colours like yellow and pink. (It was actually painful to see the pink houses. They didn’t look cute at all.) I was not able to find the outlet of drainage system, but I can at least confirm that they were not dumping it in the “3 lakes.” However, there are a lot of swamps, which are disappearing with creation of new residential homes. In fact, I was able to find more pigs than cows or horses in the area. Those houses, however, looked pretty comfortable. The houses of the poor regions, on the other hand, fared much worse. There was virtual absence of paint on buildings, and some 1 room houses were actually in the middle of a swamp, with people using scattered bricks to go inside their own houses.
Transportation
For people without private means of transportation, tempo is the only vehicle that they can use to travel from one place to another. Tempo can be thought of as a big auto-rickshaw with a capacity of up to 11 adults. For people from the poor village, the fare for the nearest market and railway station is ₹20. In the city, due to considerable urban sprawl, the fare for going from one corner of the city to another can cost even up to ₹100. The number of private cars have increased a lot since the last time I came here 5+ years ago. Cars, which are usually purchased by people in the city, can now be spotted even in the poor village. I don’t think there is any public transport.
Village
Most houses in the village only have a ground floor. The walls are made of bricks, while the roof is made of a combination of bamboo and ceramic tiles. Earlier the houses were made of mud and dry grasses, but the constant need for maintenance was very bothersome for the villagers. The houses become very hot during summers, so people would escape to the forest in afternoon. This escape is not possible for villages with little forest cover, and living in that heat is unbearable.
Most houses have toilet nowadays. One person told me how a group of vigilantes started slapping people who were defecating on the road, with the result of people shifting to forests for defecation. Groups of houses usually use a common hand pump. The hand pump gives cold water in the summers, and hot water in the winters. The water is drinkable. However, nearby villages are feeling a acute scarcity of drinkable water.
The electricity supply has improved over the years. Earlier there was electricity only at night with frequent cuts. Now it’s available both in day and night with less frequent cuts. Households have a smart phone or at least a dumb phone. The government have added street lamps powered by solar power at around 10m distance in the village. No lamp have been stolen yet. The younger generation exhibit some skill in operating the smart phones, but that only go as far as pushing a particular sequence of buttons. It is better than nothing though. A lot of houses have government subsidized TVs right in their home. Only a few years earlier there was only 1 TV in the whole village, with many people gathering at that house to watch TV in a very communal manner.
There is a sharp hindu-muslim divide in the village. So sharp, in fact, such that hindu live on one side of the road while muslim live on the other side. The hindus talk of the other side with much prejudice. However, I was surprised to see that during Muharram almost all hindus participated in the proceedings, providing lemon juice and money if they were not walking in the march.
ಕುವೆಂಪು ಅವರು ಮನುಜ ಮತ ಮತ್ತು ವಿಶ್ವಪಥದ ಬಗ್ಗೆ ಮಾತನಾಡುತ್ತಿರುವ ಈ ಸಂದರ್ಶನವನ್ನು ನಾನು ಈಗಷ್ಟೇ ಮೊದಲ ಬಾರಿಗೆ ಕೇಳಿದ್ದು. ಇದುವರೆಗೆ ಇವುಗಳ ಬಗ್ಗೆ ನಾನು ಅವರ ಪುಸ್ತಕಗಳಲ್ಲಿ ಮಾತ್ರ ಓದಿದ್ದೆ. ಹಾಗಾಗಿ, ನಾನು ಲಿಪ್ಯಂತರ(? transcribe) ಮಾಡಿ ಅದನ್ನು ಹೆಚ್ಚು ಜನರಿಗೆ ಲಭ್ಯವಾಗಿಸಲು ಇಲ್ಲಿ ಪ್ರಯತ್ನಿಸಿದ್ದೇನೆ1.
ಸಂದರ್ಶಕ: ಹಿಂದೂ ಧರ್ಮ ವಿಶ್ವ ಧರ್ಮ ಎಂದು ಕರೆಯಬಹುದೇ?
ಇಲ್ಲ. ನಿಮ್ಮ ಹಿಂದೂ ಧರ್ಮ ವಿಶ್ವ ಧರ್ಮ ಆಗಬೇಕಾಗಿದ್ದರೆ ವರ್ಣ ವ್ಯವಸ್ಥೆ, ಜಾತಿ ಪದ್ಧತಿ ಮತ್ತು ಅಸ್ಪೃಶ್ಯತೆಗಳನ್ನು ಸಂಪೂರ್ಣವಾಗಿ ವಿಸರ್ಜಿಸಿದರೆ ಮಾತ್ರ ಅದು ಸಾಧ್ಯ. ವೇದಾಂತ ದರ್ಶನ ಮಾತ್ರ ಹಿಂದೂ ಧರ್ಮದ ತಾತ್ವಿಕ ಬಿತ್ತಿಯಾಗಬೇಕು. ಯಾವ ಹಿಂದೂವಾದರೂ, ಯಾವ ಮಠಕ್ಕಾಗಲಿ ಧಾರ್ಮಿಕ ಸಂಸ್ಥೆಗಾಗಲಿ, ಅಧಿಪತಿಯಾಗುವ ಅವಕಾಶವಿರತಕ್ಕಂತದ್ದು. ಈಗಿರುವಂತೆ ಜಾತಿ, ಮತ, ವರ್ಣಗಳಿಂದ ಕಲುಷಿತವಾಗಿರುವ ಹಿಂದೂ ಧರ್ಮ ವಿಶ್ವ ಧರ್ಮ ಎನಿಸಿಕೊಳ್ಳಲು ಆಗದು.
ಕ್ರಿಶ್ಚಿಯನ್ನರನ್ನು ಮುಸಲ್ಮಾನರನ್ನು ಪುನರ್ಮತಾಂತರಕರಿಸುವ ಸನ್ನಾಹ ಅಲ್ಲಿ ಇಲ್ಲಿ ನಡೀತಿರುವುದಷ್ಟೇ. ಅವರು ಮತ್ತೆ ಹಿಂದೂ ಧರ್ಮಕ್ಕೆ ಸೇರುವುದಾದರೆ ಸಮಾಜದಲ್ಲಿ ಅವರ ಸ್ಥಾನಮಾನಗಳೇನು? ಹರಿಜನರು ಹರಿಜನರಾಗಿಯೇ ಉಳಿಯುವ ಪಕ್ಷಕ್ಕೆ ಅವರೇಕೆ ಮರಳಿ ಬರಬೇಕು? ಅವರನ್ನು ಬ್ರಾಹ್ಮಣ ವರ್ಗಕ್ಕೆ ಸೇರಿಸಿಕೊಳ್ಳಲಾಗುತ್ತದೆಯೇ? ಹಾಗಿಲ್ಲದೆ ಇದ್ದ ಪಕ್ಷದಲ್ಲಿ ಪುನರ್ ಮತಾಂತರ ಮಾಡಿಸುವ ಜನ ವಂಚಕರಾಗುತ್ತಾರೆ. ಪುನರ್ ಮತಾಂತರ ಹೊಂದುವ ಜನ ಬೆಪ್ಪು ತಕ್ಕಡಿಗಳಾಗ್ತಾರೆ. ಅವರು ಮತ್ತೆ ಜಾತೀಯತೆಯ ವಿಷಕ್ಕೆ ಏಕೆ ಬಲಿಯಾಗಬೇಕು? ವರ್ಣ ವರ್ಗಗಳ ವ್ಯತ್ಯಾಸವಳಿದು, ಅಸ್ಪೃಶ್ಯತೆ ನಿರ್ಮೂಲನ ಆದಾಗ ಮಾತ್ರ ಹಿಂದೂ ಧರ್ಮ ಅದರ ನಿಯಮ ಆಗುತ್ತೆ2
ನನಗೆ ಯಾವ ಮತದ ಗೊಜೂ ಇಲ್ಲ. ನಾನು ಯಾವ ಮತಕ್ಕೂ ಸೇರಿದವನಲ್ಲ. ನನ್ನದು ಮನುಜ ಮತ. ವಿಶ್ವಪಥ. ನಾನು ಹಿಂದೂ ಅಲ್ಲ. ವಿಶ್ವ ಮಾನವ. ಮತವನ್ನು ತೊರೆದು ಅಧ್ಯಾತ್ಮ ಪಥವನ್ನು ಸ್ವೀಕರಿಸಿದ ಪ್ರತಿಯೊಬ್ಬ ವ್ಯಕ್ತಿಯೂ ವಿಶ್ವಮಾನವನಾಗುತ್ತಾನೆ. ಅಧ್ಯಾತ್ಮ ಕಾಲದೇಶಾತೀತವಾದದ್ದು, ಅದು ದೇಶದಿಂದ ದೇಶಕ್ಕೆ, ಜನಾಂಗದಿಂದ ಜನಾಂಗಕ್ಕೆ ವ್ಯತ್ಯಾಸವಾಗಲಾರದು. ರಸಾಯನ ಶಾಸ್ತ್ರ ಭೌತ ವಿಜ್ಞಾನದಂತೆ ಅಧ್ಯಾತ್ಮ ಸೂತ್ರಗಳು ವಿಶ್ವ ಮಾನ್ಯವಾಗಬೇಕು.
ಸಂದರ್ಶಕ:: ನೀವು ಈಚೆಗೆ ಪ್ರತಿಪಾದಿಸುತ್ತಿರುವ ಪಂಚಮಂತ್ರ, ಸಪ್ತ ಸೂತ್ರ ಹಾಗೂ ವಿಶ್ವ ಮಾನವ ಸಂದೇಶಗಳು ನಾಡಿನ ಹಾಗೂ ಲೋಕದ ನಾನಾ ಜಾಡ್ಯಗಳಿಗೆ ಸಿದ್ಧ ಔಷಧಿಗಳೆಂದು ಹೇಳಬಹುದೇ? ಅವುಗಳ ಸರ್ವಾನುಷ್ಠಾನ ಸಾಧ್ಯವೇ?
ಸರ್ವೋದಯವೇ ಸಕಲ ಸಾಧನೆಗಳ ಗುರಿಯಾಗಬೇಕು. ಪೂರ್ಣ ದೃಷ್ಟಿ ಮತ್ತು ಸಮನ್ವಯ ಭಾವದಿಂದ ಮೇಲು ಕೀಳುಗಳ ಭೇದ ಹರಿಯುತ್ತಿದೆ. ಮನುಷ್ಯನನ್ನು ಮನುಷ್ಯನಿಂದ ಬೇರ್ಪಡಿಸುವ ಹತ್ತಾರು ಮತ ಬೇಡ. ಅವನೇ ಕೇಂದ್ರವಾಗುಳ್ಳ ಮನುಜ ಮತ ಒಂದೇ ಸಾಕು. ಮನುಷ್ಯನಲ್ಲಿ ಗೊಂದಲ ಉಂಟುಮಾಡಿ, ಅವನ ಏಕಾಗ್ರತೆಗೆ ಭಂಗ ತರುವ ಎಲ್ಲಾ ತತ್ವಗಳನ್ನು ಮೀರಿದ, ಮಾನವೀಯ ಮೌಲ್ಯಗಳೇ ಗುರಿಯಾಗುಳ್ಳ, ವಿಶ್ವಪಥದಲ್ಲಿ ಮಾನವನಾಗಬೇಕು. ವರ್ಣ, ಜಾತಿ, ವರ್ಗಗಳನ್ನು ಸೃಷ್ಟಿಸುವ ಮತ ಬೇಡ. ಅಧ್ಯಾತ್ಮ ಸಾಧನೆಯೊಂದೇ ಮಾನವನ ಗುರಿಯಾಗಬೇಕು. ಆ ಈ ಜಾತಿಗಳೆಲ್ಲ, ಮನುಷ್ಯ ಜಾತಿಯಲ್ಲಿ, ಆ ಈ ಮತಗಳೆಲ್ಲ, ಮನುಜ ಮತದಲ್ಲಿ, ಒಂದಾಗಬೇಕು. 4000 ವರ್ಷಗಳಿಂದ ಮತ ಗುಂಪು ಕಟ್ಟುವ, ಜಗಳ ಹಚ್ಚುವ, ಮನ ಮನಗಳ ನಡುವೆ ಗೋಡೆ ಎಬ್ಬಿಸುವ, ದೇಶ ದೇಶಗಳನ್ನು ವಿಭಜಿಸುವ ಸಾಧನವಾಗಿದೆಯೇ ಹೊರತು ಎಲ್ಲ ಮಾನವರನ್ನು ಒಂದು ಮಾಡುವ ಶಕ್ತಿ ಆಗಿಲ್ಲ.
ರಾಜಕೀಯದಲ್ಲಿ, ವ್ಯಾಪಾರದಲ್ಲಿ ಗುಂಪುಗಾರಿಕೆ ಬೇಕಾಗಬಹುದಾದರೂ, ಒದ್ಯಾತು ವಿಚಾರದಲ್ಲಿ ಮಾತ್ರ ಬೇಡ. ವ್ಯಕ್ತಿಯ ಮತ್ತು ಭಗವಂತನ ನಡುವಣ ಸಂಬಂಧ ಅತ್ಯಂತ ನಿಗೂಢವಾದದ್ದು. ಅಂತೆಯೇ ವೈಯಕ್ತಿಕವಾಗಿದೆ. ತಮ್ಮ ಸಂಖ್ಯೆಯನ್ನು ಬೆಳೆಸಿಕೊಂಡು, ಗೂಂಪು ಕಟ್ಟಿ, ರಾಜಕೀಯ ಮಾಡುವ ಸಲುವಾಗಿ ಮತಾಂತರ ನಡೆಯುತ್ತಿದೆ. ಅಧ್ಯಾತ್ಮ ಎಂದು ಅದರ ಗುರಿಯಾಗಿಲ್ಲ. ಲೋಕದ ಎಲ್ಲ ಜಾಡ್ಯಗಳಿಗೂ ಮತೀಯ ರೂಪದ ವ್ಯವಸ್ಥೆಯೇ ಮೂಲ ಕಾರಣ. ಚೇತನ ಅನಿಕೇತನವಾದಾಗ, ಅಂದರೆ ಲೌಕಿಕವಾದ, ಆತ್ಮ ವಿನಾಶಕಾರಿಯಾದ, ಎಲ್ಲ ವ್ಯವಸ್ಥೆಗಳಿಂದ ಪಾರಾದಾಗ, ಮತ ಮನುಜ ಮತವಾದಾಗ, ಮನುಷ್ಯ ವಿಶ್ವ ಮಾನವನಾದಾಗ, ಎಲ್ಲ ವೈಯಕ್ತಿಕ, ಸಾಂಸ್ಠಿಕ, ದ್ವಿರಸ ವೈಷಮ್ಯಗಳು ತೊಲಗುತ್ತವೆ.
ಪ್ರತಿ ವ್ಯಕ್ತಿಯ ಉದ್ದಾರವೇ ವಿಶ್ವಮಾನವನ ಗುರಿ. ಅದು ವೈಯಕ್ತಿಕವಾದದ್ದೆ ಹೊರತು ಸಾಂಸ್ಠಿಕವಾದದ್ದಲ್ಲ. ವ್ಯಕ್ತಿಕರಣದ ಮೂಲಕ ಅದು ತನ್ನ ಗುರಿಯನ್ನು ಸಾಧಿಸುತ್ತದೆ.
ಅದೊಂದು ಮತವಾಗಬಾರದು. ಅದರ ಸ್ವರೂಪ ಲಕ್ಷಣಗಳನ್ನು ಕುರಿತು ಪ್ರಸಾರ ಮಾಡಬಹುದೇ ಹೊರತು, ಅದರ ಹೆಸರಿನಲ್ಲಿ ಗುಂಪುಗಾರಿಕೆ ಸಲ್ಲದು. ಸಂಘ ಸಂಸ್ಥೆಗಳ ಪ್ರತಿಷ್ಠಾಪನೆ ಕೂಡದು. ವ್ಯಕ್ತಿಯೇ ಕೇಂದ್ರವಾದ್ದರಿಂದ, ಮತರೂಪವಾದ ಸಾಮೂಹಿಕ ಪರಿವರ್ತನೆಗೆ ಅದು ವಿರೋಧಿ.
ತಾನೊಬ್ಬ ವಿಶ್ವಮಾನವ, ಯಾವ ಮತಕ್ಕೂ ಸೇರಿದವನಲ್ಲ ಎಂಬ ಭಾವನೆ ಪ್ರತಿಯೊಬ್ಬರಲ್ಲಿಯೂ ಮೂಡಿದಾಗ ಅನೇಕ ರಾಜಕೀಯ, ಸಾಮಾಜಿಕ, ಆರ್ಥಿಕ ಜಾಡ್ಯಗಳು ಕಡೆಗೊಳ್ಳುವುದಲ್ಲದೆ ಮಾನಸಿಕ ಶಾಂತಿ ದೊರೆಯುತ್ತದೆ. ವ್ಯಕ್ತಿಯ ಮಾನಸಿಕ ಶಾಂತಿಯೇ, ವಿಶ್ವ ಶಾಂತಿಗೆ ಬುನಾದಿ ಆಗುತ್ತದೆ. ಅಧ್ಯಾತ್ಮದ ವೈಯಕ್ತೀಕರಣವೇ ವಿಶ್ವ ಮಾನವ ಸಂದೇಶದ ತಿರುಳು.
ನಾನು ಹಿಂದೂ ಅಲ್ಲ. ವಿಶ್ವ ಮಾನವ.
You can read this blog using RSS Feed. But if you are the person who loves getting emails, then you can join my readers by signing up.
In December 2024, I went on a trip through four countries - Singapore, Malaysia, Brunei, and Vietnam - with my friend Badri. This post covers our experiences in Singapore.
I took an IndiGo flight from Delhi to Singapore, with a layover in Chennai. At the Chennai airport, I was joined by Badri. We had an early morning flight from Chennai that would land in Singapore in the afternoon. Within 48 hours of our scheduled arrival in Singapore, we submitted an arrival card online. At immigration, we simply needed to scan our passports at the gates, which opened automatically to let us through, and then give our address to an official nearby. The process was quick and smooth, but it unfortunately meant that we didn’t get our passports stamped by Singapore.
Before I left the airport, I wanted to visit the nature-themed park with a fountain I saw in pictures online. It is called Jewel Changi, and it took quite some walking to get there. After reaching the park, we saw a fountain that could be seen from all the levels. We roamed around for a couple of hours, then proceeded to the airport metro station to get to our hotel.
A shot of Jewel Changi. Photo by Ravi Dwivedi. Released under the CC-BY-SA 4.0.
There were four ATMs on the way to the metro station, but none of them provided us with any cash. This was the first country (outside India, of course!) where my card didn’t work at ATMs.
To use the metro, one can tap the EZ-Link card or bank cards at the AFC gates to get in. You cannot buy tickets using cash. Before boarding the metro, I used my credit card to get Badri an EZ-Link card from a vending machine. It was 10 Singapore dollars (₹630) - 5 for the card, and 5 for the balance. I had planned to use my Visa credit card to pay for my own fare. I was relieved to see that my card worked, and I passed through the AFC gates.
We had booked our stay at a hostel named Campbell’s Inn, which was the cheapest we could find in Singapore. It was ₹1500 per night for dorm beds. The hostel was located in Little India. While Little India has an eponymous metro station, the one closest to our hostel was Rochor.
On the way to the hostel, we found out that our booking had been canceled.
We had booked from the Hostelworld website, opting to pay the deposit in advance and to pay the balance amount in person upon reaching. However, Hostelworld still tried to charge Badri’s card again before our arrival. When the unauthorized charge failed, they sent an automatic message saying “we tried to charge” and to contact them soon to avoid cancellation, which we couldn’t do as we were in the plane.
Despite this, we went to the hostel to check the status of our booking.
The trip from the airport to Rochor required a couple of transfers. It was 2 Singapore dollars (approx. ₹130) and took approximately an hour.
Upon reaching the hostel, we were informed that our booking had indeed been canceled, and were not given any reason for the cancelation. Furthermore, no beds were available at the hostel for us to book on the spot.
We decided to roam around and look for accommodation at other hostels in the area. Soon, we found a hostel by the name of Snooze Inn, which had two beds available. It was 36 Singapore dollars per person (around ₹2300) for a dormitory bed. Snooze Inn advertised supporting RuPay cards and UPI. Some other places in that area did the same. We paid using my card. We checked in and slept for a couple of hours after taking a shower.
By the time we woke up, it was dark. We met Praveen’s friend Sabeel to get my FLX1 phone. We also went to Mustafa Center nearby to exchange Indian rupees for Singapore dollars. Mustafa Center also had a shopping center with shops selling electronic items and souvenirs, among other things. When we were dropping off Sabeel at a bus stop, we discovered that the bus stops in Singapore had a digital board mentioning the bus routes for the stop and the number of minutes each bus was going to take.
In addition to an organized bus system, Singapore had good pedestrian infrastructure. There were traffic lights and zebra crossings for pedestrians to cross the roads. Unlike in Indian cities, rules were being followed. Cars would stop for pedestrians at unmanaged zebra crossings; pedestrians would in turn wait for their crossing signal to turn green before attempting to walk across. Therefore, walking in Singapore was easy.
Traffic rules were taken so seriously in Singapore I (as a pedestrian) was afraid of unintentionally breaking them, which could get me in trouble, as breaking rules is dealt with heavy fines in the country. For example, crossing roads without using a marked crossing (while being within 50 meters of it) - also known as jaywalking - is an offence in Singapore.
Moreover, the streets were litter-free, and cleanliness seemed like an obsession.
After exploring Mustafa Center, we went to a nearby 7-Eleven to top up Badri’s EZ-Link card. He gave 20 Singapore dollars for the recharge, which credited the card by 19.40 Singapore dollars (0.6 dollars being the recharge fee).
When I was planning this trip, I discovered that the World Chess Championship match was being held in Singapore. I seized the opportunity and bought a ticket in advance. The next day - the 5th of December - I went to watch the 9th game between Gukesh Dommaraju of India and Ding Liren of China. The venue was a hotel on Sentosa Island, and the ticket was 70 Singapore dollars, which was around ₹4000 at the time.
We checked out from our hostel in the morning, as we were planning to stay with Badri’s aunt that night. We had breakfast at a place in Little India. Then we took a couple of buses, followed by a walk to Sentosa Island. Paying the fare for the buses was similar to the metro - I tapped my credit card in the bus, while Badri tapped his EZ-Link card. We also had to tap it while getting off.
If you are tapping your credit card to use public transport in Singapore, keep in mind that the total amount of all the trips taken on a day is deducted at the end. This makes it hard to determine the cost of individual trips. For example, I could take a bus and get off after tapping my card, but I would have no way to determine how much this journey cost.
When you tap in, the maximum fare amount gets deducted. When you tap out, the balance amount gets refunded (if it’s a shorter journey than the maximum fare one). So, there is incentive for passengers not to get off without tapping out. Going by your card statement, it looks like all that happens virtually, and only one statement comes in at the end. Maybe this combining only happens for international cards.
We got off the bus a kilometer away from Sentosa Island and walked the rest of the way. We went on the Sentosa Boardwalk, which is itself a tourist attraction. I was using Organic Maps to navigate to the hotel Resorts World Sentosa, but Organic Maps’ route led us through an amusement park. I tried asking the locals (people working in shops) for directions, but it was a Chinese-speaking region, and they didn’t understand English. Fortunately, we managed to find a local who helped us with the directions.
A shot of Sentosa Boardwalk. Photo by Ravi Dwivedi. Released under the CC-BY-SA 4.0.
Following the directions, we somehow ended up having to walk on a road which did not have pedestrian paths. Singapore is a country with strict laws, so we did not want to walk on that road. Avoiding that road led us to the Michael Hotel. There was a person standing at the entrance, and I asked him for directions to Resorts World Sentosa. The person told me that the bus (which was standing at the entrance) would drop me there! The bus was a free service for getting to Resorts World Sentosa. Here I parted ways with Badri, who went to his aunt’s place.
I got to the Resorts Sentosa and showed my ticket to get in. There were two zones inside - the first was a room with a glass wall separating the audience and the players. This was the room to watch the game physically, and resembled a zoo or an aquarium. :) The room was also a silent room, which means talking or making noise was prohibited. Audiences were only allowed to have mobile phones for the first 30 minutes of the game - since I arrived late, I could not bring my phone inside that room.
The other zone was outside this room. It had a big TV on which the game was being broadcast along with commentary by David Howell and Jovanka Houska - the official FIDE commentators for the event. If you don’t already know, FIDE is the authoritative international chess body.
I spent most of the time outside that silent room, giving me an opportunity to socialize. A lot of people were from Singapore. I saw there were many Indians there as well. Moreover, I had a good time with Vasudevan, a journalist from Tamil Nadu who was covering the match. He also asked questions to Gukesh during the post-match conference. His questions were in Tamil to lift Gukesh’s spirits, as Gukesh is a Tamil speaker.
Tea and coffee were free for the audience. I also bought a T-shirt from their stall as a souvenir.
After the game, I took a shuttle bus from Resorts World Sentosa to a metro station, then travelled to Pasir Ris by metro, where Badri was staying with his aunt. I thought of getting something to eat, but could not find any cafés or restaurants while I was walking from the Pasir Ris metro station to my destination, and was positively starving when I got there.
Badri’s aunt’s place was an apartment in a gated community. On the gate was a security guard who asked me the address of the apartment. Upon entering, there were many buildings. To enter the building, you need to dial the number of the apartment you want to go to and speak to them. I had seen that in the TV show Seinfeld, where Jerry’s friends used to dial Jerry to get into his building.
I was afraid they might not have anything to eat because I told them I was planning to get something on the way. This was fortunately not the case, and I was relieved to not have to sleep with an empty stomach.
Badri’s uncle gave us an idea of how safe Singapore is. He said that even if you forget your laptop in a public space, you can go back the next day to find it right there in the same spot. I also learned that owning cars was discouraged in Singapore - the government imposes a high registration fee on them, while also making public transport easy to use and affordable. I also found out that 7-Eleven was not that popular among residents in Singapore, unlike in Malaysia or Thailand.
The next day was our third and final day in Singapore. We had a bus in the evening to Johor Bahru in Malaysia. We got up early, had breakfast, and checked out from Badri’s aunt’s home. A store by the name of Cat Socrates was our first stop for the day, as Badri wanted to buy some stationery. The plan was to take the metro, followed by the bus. So we got to Pasir Ris metro station. Next to the metro station was a mall. In the mall, Badri found an ATM where our cards worked, and we got some Singapore dollars.
It was noon when we reached the stationery shop mentioned above. We had to walk a kilometer from the place where the bus dropped us. It was a hot, sunny day in Singapore, so walking was not comfortable. We had to go through residential areas in Singapore. We saw some non-touristy parts of Singapore.
After we were done with the stationery shop, we went to a hawker center to get lunch. Hawker centers are unique to Singapore. They have a lot of shops that sell local food at cheap prices. It is similar to a food court. However, unlike the food courts in malls, hawker centers are open-air and can get quite hot.
This is the hawker center we went to. Photo by Ravi Dwivedi. Released under the CC-BY-SA 4.0.
To have something, you just need to buy it from one of the shops and find a table. After you are done, you need to put your tray in the tray-collecting spots. I had a kaya toast with chai, since there weren’t many vegetarian options. I also bought a persimmon from a nearby fruit vendor. On the other hand, Badri sampled some local non-vegetarian dishes.
Table littering at the hawker center was prohibited by law. Photo by Ravi Dwivedi. Released under the CC-BY-SA 4.0.
Next, we took a metro to Raffles Place, as we wanted to visit Merlion, the icon of Singapore. It is a statue having the head of a lion and the body of a fish. While getting through the AFC gates, my card was declined. Therefore, I had to buy an EZ-Link card, which I had been avoiding because the card itself costs 5 Singapore dollars.
From the Raffles Place metro station, we walked to Merlion. The place also gave a nice view of Marina Bay Sands. It was filled with tourists clicking pictures, and we also did the same.
Merlion from behind, giving a good view of Marina Bay Sands. Photo by Ravi Dwivedi. Released under the CC-BY-SA 4.0.
After this, we went to the bus stop to catch our bus to the border city of Johor Bahru, Malaysia. The bus was more than an hour late, and we worried that we had missed the bus. I asked an Indian woman at the stop who also planned to take the same bus, and she told us that the bus was late. Finally, our bus arrived, and we set off for Johor Bahru.
Before I finish, let me give you an idea of my expenditure. Singapore is an expensive country, and I realized that expenses could go up pretty quickly. Overall, my stay in Singapore for 3 days and 2 nights was approx. 5500 rupees. That too, when we stayed one night at Badri’s aunt’s place (so we didn’t have to pay for accomodation for one of the nights) and didn’t have to pay for a couple of meals. This amount doesn’t include the ticket for the chess game, but includes the costs of getting there. If you are in Singapore, it is likely you will pay a visit to Sentosa Island anyway.
Stay tuned for our experiences in Malaysia!
Credits: Thanks to Dione, Sahil, Badri and Contrapunctus for reviewing the draft. Thanks to Bhe for spotting a duplicate sentence.
I sometimes use Vagrant to deploy my VM's and recently when I tried to deploy one for Trixie, I could see one available. So I checked the official Debian images on Vagrant cloud at https://portal.cloud.hashicorp.com/vagrant/discover/debian and could not find an image for trixie on Vagrant cloud.
Also looked at other cloud image sources like Docker hub, and I could see an image their for Trixie. So I looked into how I can generate a Vagrant image locally for Debian to use.
this will install some dependency packages, will ask for sudo password if need to install something not already installed.
Let's call make help
$ make help
To run this makefile, run:
make <DIST>-<CLOUD>-<ARCH>
WHERE <DIST> is bullseye, buster, stretch, sid or testing
And <CLOUD> is azure, ec2, gce, generic, genericcloud, nocloud, vagrant, vagrantcontrib
And <ARCH> is amd64, arm64, ppc64el
Set DESTDIR= to write images to given directory.
$ make trixie-vagrant-amd64
umask 022; \
./bin/debian-cloud-images build \
trixie vagrant amd64 \
--build-id vagrant-cloud-images-master \
--build-type official
usage: debian-cloud-images build
debian-cloud-images build: error: argument RELEASE: invalid value: trixie
make: *** [Makefile:22: trixie-vagrant-amd64] Error 2
As you can see, trixie is not even in the available options and it is not building as well. Before trying to look at updating the codebase, I looked at the pending MR's on Salsa and found Michael Ablassmeier's pending merge request at https://salsa.debian.org/cloud-team/debian-vagrant-images/-/merge_requests/18
So let me test that commit and see if I can build trixie locally from Michael's MR
$ make help
To run this makefile, run:
make <DIST>-<CLOUD>-<ARCH>
WHERE <DIST> is bullseye, buster, stretch, sid or testing
And <CLOUD> is azure, ec2, gce, generic, genericcloud, nocloud, vagrant, vagrantcontrib
And <ARCH> is amd64, arm64, ppc64el
Set DESTDIR= to write images to given directory.
$ make trixie-vagrant-amd64
umask 022; \
./bin/debian-cloud-images build \
trixie vagrant amd64 \
--build-id vagrant-cloud-images-master \
--build-type official
2025-09-17 00:36:25,919 INFO Adding class DEBIAN
2025-09-17 00:36:25,919 INFO Adding class CLOUD
2025-09-17 00:36:25,919 INFO Adding class TRIXIE
2025-09-17 00:36:25,920 INFO Adding class VAGRANT
2025-09-17 00:36:25,920 INFO Adding class AMD64
2025-09-17 00:36:25,920 INFO Adding class LINUX_IMAGE_BASE
2025-09-17 00:36:25,920 INFO Adding class GRUB_PC
2025-09-17 00:36:25,920 INFO Adding class LAST
2025-09-17 00:36:25,921 INFO Running FAI: sudo env PYTHONPATH=/home/rajudev/dev/salsa/michael/debian-vagrant-images/src/debian_cloud_images/build/../.. CLOUD_BUILD_DATA=/home/rajudev/dev/salsa/michael/debian-vagrant-images/src/debian_cloud_images/data CLOUD_BUILD_INFO={"type": "official", "release": "trixie", "release_id": "13", "release_baseid": "13", "vendor": "vagrant", "arch": "amd64", "build_id": "vagrant-cloud-images-master", "version": "20250917-1"} CLOUD_BUILD_NAME=debian-trixie-vagrant-amd64-official-20250917-1 CLOUD_BUILD_OUTPUT_DIR=/home/rajudev/dev/salsa/michael/debian-vagrant-images CLOUD_RELEASE_ID=vagrant CLOUD_RELEASE_VERSION=20250917-1 fai-diskimage --verbose --hostname debian --class DEBIAN,CLOUD,TRIXIE,VAGRANT,AMD64,LINUX_IMAGE_BASE,GRUB_PC,LAST --size 100G --cspace /home/rajudev/dev/salsa/michael/debian-vagrant-images/src/debian_cloud_images/build/fai_config debian-trixie-vagrant-amd64-official-20250917-1.raw
..... continued
Although we can now build the images, we just don't see an option for it in the help text, not even for bookworm. Just the text in Makefile is outdated, but I can build and trixie Vagrant box now. Thanks to Michael for the fix.
I regularly use Bugzilla as part of my job, so I built an MCP server to streamline my workflow & make Bugzilla data accessible to LLMs. This is my first tool in the LLM ecosystem!
During the first week I tried the official SDK, but I didn’t like how it worked. Later I discovered the well-documented and easy-to-use Python library fastmcp, which made development much smoother.
Just a few days ago, I released v0.1.0 of mcp-bugzilla. It currently provides two tools: one that fetches bug details and another that retrieves bug comments. There’s also a prompt component that summarizes a bug’s comments. I plan to add more features soon. Try it out and share your feedback — I’d appreciate it.
On the 8th of August 2025 (a day before the Debian Trixie release), I was upgrading my personal laptop from Debian Bookworm to Trixie. It was a major update. However, the update didn’t go smoothly, and I ran into some errors. From the Debian support IRC channel, I got to know that it would be best if I removed the texlive packages.
However, it was not so easy to just remove texlive with a simple apt remove command. I had to remove the texlive packages from /usr/bin. Then I ran into other errors. Hours after I started the upgrade, I realized I preferred having my system as it was before, as I had to travel to Noida the next day. Needless to say, I wanted to go to sleep rather than fix my broken system. Only if I had a way to go back to my system before I started upgrading, it would have saved a lot of trouble for me. I ended up installing Trixie from scratch.
It turns out that there was a way to recover to the state before the upgrade - using Timeshift to roll back the system to a state (in our example, it is the state before the upgrade process started) in the past. However, it needs the Btrfs filesystem with appropriate subvolumes, not provided by Debian installer in their guided partitioning menu.
I have set it up after a few weeks of the above-mentioned incident. Let me demonstrate how it works.
Check the screenshot above. It shows a list of snapshots made by Timeshift. Some of them were made by me manually. Others were made by Timeshift automatically as per the routine - I have set up hourly backups and weekly backups etc.
In the above-mentioned major update, I could have just taken a snapshot using Timeshift before performing the upgrade and could have rolled back to that snapshot when I found that I cannot spend more time on fixing my installation errors. Then I could just perform the upgrade later.
Installation
In this tutorial, I will cover how I installed Debian with Btrfs and disk encryption, along with creating subvolumes @ for root and @home for /home so that I can use Timeshift to create snapshots. These snapshots are kept on the same disk where Debian is installed, and the use-case is to roll back to a working system in case I mess up something or to recover an accidentally deleted file.
I went through countless tutorials on the Internet, but I didn’t find a single tutorial covering both the disk encryption and the above-mentioned subvolumes (on Debian). Debian doesn’t create the desired subvolumes by default, therefore the process requires some manual steps, which beginners may not be comfortable performing. Beginners can try distros such as Fedora and Linux Mint, as their installation includes Btrfs with the required subvolumes.
Furthermore, it is pertinent to note that I used Debian Trixie’s DVD iso on a real laptop (not a virtual machine) for my installation. Debian Trixie is the codename for the current stable version of Debian. Then I took screenshots in a virtual machine by repeating the process. Moreover, a couple of screenshots are from the installation I did on the real laptop.
Let’s start the tutorial by booting up the Debian installer.
The above screenshot shows the first screen we see on the installer. Since we want to choose Expert Install, we select Advanced Options in the screenshot above.
Let’s select the Expert Install option in the above screenshot. It is because we want to create subvolumes after the installer is done with the partition, and only then proceed to installing the base system. “Non-expert” install modes proceed directly to installing the system right after creating partitions without pausing for us to create the subvolumes.
After selecting the Expert Install option, you will get the screen above. I will skip to partitioning from here and leave the intermediate steps such as choosing language, region, connecting to Wi-Fi, etc. For your reference, I did create the root user.
Let’s jump right to the partitioning step. Select the Partition disks option from the menu as shown above.
Choose Manual.
Select your disk where you would like to install Debian.
Select Yes when asked for creating a new partition.
I chose the msdos option as I am not using UEFI. If you are using UEFI, then you need to choose the gpt option. Also, your steps will (slightly) differ from mine if you are using UEFI. In that case, you can watch this video by the YouTube channel EF Linux in which he creates an EFI partition. As he doesn’t cover disk encryption, you can continue reading this post after following the steps corresponding to EFI.
Select the free space option as shown above.
Choose Create a new partition.
I chose the partition size to be 1 GB.
Choose Primary.
Choose Beginning.
Now, I got to this screen.
I changed mount point to /boot and turned on the bootable flag and then selected “Done setting up the partition.”
Now select free space.
Choose the Create a new partition option.
I made the partition size equal to the remaining space on my disk. I do not intend to create a swap partition, so I do not need more space.
Select Primary.
Select the Use as option to change its value.
Select “physical volume for encryption.”
Select Done setting up the partition.
Now select “Configure encrypted volumes.”
Select Yes.
Select Finish.
Selecting Yes will take a lot of time to erase the data. Therefore, I would say if you have hours for this step (in case your SSD is like 1 TB), then I would recommend selecting “Yes.” Otherwise, you could select “No” and compromise on the quality of encryption.
After this, you will be asked to enter a passphrase for disk encryption and confirm it. Please do so. I forgot to take the screenshot for that step.
Now select that encrypted volume as shown in the screenshot above.
Here we will change a couple of options which will be shown in the next screenshot.
In the Use as menu, select “btrfs journaling file system.”
Now, click on the mount point option.
Change it to “/ - the root file system.”
Select Done setting up the partition.
This is a preview of the paritioning after performing the above-mentioned steps.
If everything is okay, proceed with the Finish partitioning and write changes to disk option.
The installer is reminding us to create a swap partition. I proceeded without it as I planned to add swap after the installation.
If everything looks fine, choose “yes” for writing the changes to disks.
Now we are done with partitioning and we are shown the screen in the screenshot above. If we had not selected the Expert Install option, the installer would have proceeded to install the base system without asking us.
However, we want to create subvolumes before proceeding to install the base system. This is the reason we chose Expert Install.
Now press Ctrl + F2.
You will see the screen as in the above screenshot. It says “Please press Enter to activate this console.” So, let’s press Enter.
After pressing Enter, we see the above screen.
The screenshot above shows the steps I performed in the console. I followed the already mentioned video by EF Linux for this part and adapted it to my situation (he doesn’t encrypt the disk in his tutorial).
First we run df -h to have a look at how our disk is partitioned. In my case, the output was:
df -h shows us that /dev/mapper/sda2_crypt and /dev/sda1 are mounted on /target and /target/boot respectively.
Let’s unmount them. For that, we run:
# umount /target
# umount /target/boot
Next, let’s mount our root filesystem to /mnt.
# mount /dev/mapper/sda2_crypt /mnt
Let’s go into the /mnt directory.
# cd /mnt
Upon listing the contents of this directory, we get:
/mnt # ls
@rootfs
Debian installer has created a subvolume @rootfs automatically. However, we need the subvolumes to be @ and @home. Therefore, let’s rename the @rootfs subvolume to @.
/mnt # mv @rootfs @
Listing the contents of the directory again, we get:
/mnt # ls
@
We only one subvolume right now. Therefore, let us go ahead and create another subvolume @home.
If we perform ls now, we will see there are two subvolumes:
/mnt # ls
@ @home
Let us mount /dev/mapper/sda2_crypt to /target
/mnt # mount -o noatime,space_cache=v2,compress=zstd,ssd,discard=async,subvol=@ /dev/mapper/sda2_crypt /target/
Now we need to create a directory for /home.
/mnt # mkdir /target/home/
Now we mount the /home directory with subvol=@home option.
/mnt # mount -o noatime,space_cache=v2,compress=zstd,ssd,discard=async,subvol=@home /dev/mapper/sda2_crypt /target/home/
Now mount /dev/sda1 to /target/boot.
/mnt # mount /dev/sda1 /target/boot/
Now we need to add these options to the fstab file, which is located at /target/etc/fstab. Unfortunately, vim is not installed in this console. The only way to edit is Nano.
nano /target/etc/fstab
Edit your fstab file to look similar to the one in the screenshot above. I am pasting the fstab file contents below for easy reference.
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# systemd generates mount units based on this file, see systemd.mount(5).
# Please run 'systemctl daemon-reload' after making changes here.
#
# <file system> <mount point> <type> <options> <dump> <pass>
/dev/mapper/sda2_crypt / btrfs noatime,compress=zstd,ssd,discard=async,space_cache=v2,subvol=@ 0 0
/dev/mapper/sda2_crypt /home btrfs noatime,compress=zstd,ssd,discard=async,space_cache=v2,subvol=@home 0 0
# /boot was on /dev/sda1 during installation
UUID=12842b16-d3b3-44b4-878a-beb1e6362fbc /boot ext4 defaults 0 2
/dev/sr0 /media/cdrom0 udf,iso9660 user,noauto 0 0
Please double check the fstab file before saving it. In Nano, you can press Ctrl+O followed by pressing Enter to save the file. Then press Ctrl+X to quit Nano. Now, preview the fstab file by running
cat /target/etc/fstab
and verify that the entries are correct, otherwise you will booted to an unusable and broken system after the installation is complete.
Next, press Ctrl + Alt + F1 to go back to the installer.
Proceed to “Install the base system.”
Screenshot of Debian installer installing the base system.
I chose the default option here - linux-image-amd64.
After this, the installer will ask you a few more questions. For desktop environment, I chose KDE Plasma. You can choose the desktop environment as per your liking. I will not cover the rest of the installation process and assume that you were able to install from here.
Post installation
Let’s jump to our freshly installed Debian system. Since I created a root user, I added the user ravi to the suoders file (/etc/sudoers) so that ravi can run commands with sudo. Follow this if you would like to do the same.
Now we set up zram as swap. First, install zram-tools.
sudo apt install zram-tools
Now edit the file /etc/default/zramswap and make sure to have the following lines are uncommented:
ALGO=lz4
PERCENT=50
Now, run
sudo systemctl restart zramswap
If you run lsblk now, you should see the below-mentioned entry in the output:
zram0 253:0 0 7.8G 0 disk [SWAP]
This shows us that zram has been activated as swap.
Now we install timeshift, which can be done by running
sudo apt install timeshift
After the installation is complete, run Timeshift and schedule snapshots as you please. We are done now. Hope the tutorial was helpful.
See you in the next post and let me know if you have any suggestions and questions on this tutorial.
I have been using my Samsung Galaxy Tab A (2015) with PostmarketOS on and off since last year. It serves as a really good e-book reader with KOReader installed on it.
Have tried phosh and plasma-mobile on it, works nicely but slows the device down heavily (2 GB RAM and old processor) so I use MATE Desktop environment on it.
Lately I have started using this tablet along with my laptop as a second screen for work. And it has been working super nicely for that. The only issue being that I have to manually rotate the screen to landscape every time I reboot the device. It resets the screen orientation to portrait after a reboot. So I went through the pmOS wiki and a neat nice hack documented there worked very well for me.
First we will test if the auto-rotate sensor works and if we can read values from it. So we install some basic necessary packages
You need to replace the name of your touch input device in the script, you can get the name by using xinput --list , make sure to type this on the device terminal.
In our script here we are using a Zinitix capacitive screen, it will be different for yours.
Once your script is ready with the correct touchscreen name. Save and make the script executable. chmod +x auto-rotate-screen.sh
Then test your script in your terminal ./auto-rotate.sh , stop the script using Ctrl + C
Now we need add this script to auto-start. On MATE DE you can go to System > Control Center > Startup Applications, then click on Custom Add button, browse the script location, give it a name and then click on Add button.
Now reboot the tablet/device, login and see the auto rotation working.
In December 2024, Badri and I went to Vietnam. In this post, I’ll document our experiences with the visa process of Vietnam. Vietnam requires an e-visa to enter the country. The official online portal for the e-visa application is evisa.xuatnhapcanh.gov.vn/. However, I submitted my visa application on the website vietnamvisa.govt.vn. It was only after submitting my application and making the payment that I realized that it’s not the official e-visa website. The realization came from the tagline mentioned in the top left corner of the website - the best way to obtain a Vietnam visa.
I was a bit upset that I got tricked by that website. I should have checked the top level domains of Vietnam’s government websites. Anyways, it is pretty easy to confuse govt.vn with gov.vn. I also paid double the amount of the official visa fee. However, I wasn’t asked to provide a flight reservation or hotel bookings - documents which are usually asked for most of the visas. But they did ask me for a photo. I was not even sure whether the website was legit or not.
Badri learnt from my experience and applied through the official Vietnam government website. During the process, he had to provide a hotel booking as well as enter the hotel address into the submission form. Additionally, the official website asked to provide the exact points of entry to and exit from the country, which the non-official website did not ask for. On the other hand, he had to pay only 25 USD versus my 54 USD.
It turned out that the website I registered on was also legit, as they informed me a week later that my visa has been approved, along with a copy of my visa. Further, I was not barred from entering and found to be holding a fake visa. It appears that the main “scam” is not about the visa being fake, but rather that you will be charged more than if you apply through the official website.
I would still recommend you (the readers) to submit your visa application only through the official website and not on any of the other such websites.
Our visa was valid for a month (my visa was valid from the 4th of December 2024 to the 4th of January 2025). We also had a nice time in Vietnam. Stay tuned for my Vietnam travel posts!
Credits to Badri for proofreading and writing his part of the experience.
This method is for wayland based systems. There are better ways to do this on GNOME or KDE desktops, but the method we are going to use is independent of DE/WM that you are using.
I am doing this on sway window manager, but you can try this on any other Wayland based WM or DE. I have not tried this on Xorg based systems, there are several other guides for Xorg based systems online.
When we connect a physical monitor to our laptops, it creates a second display output in our display settings that we can then re-arrange in layout, set resolution, set scale etc. Since we are not connecting via a physical interface like HDMI, DP, VGA etc. We need to create a virtual display within our system and set the display properties manually.
Get a list of current display outputs. You can also just check it in display settings of your DE/WM with wdisplays
rajudev@sanganak ~> swaymsg -t get_outputs
Output LVDS-1 'Seiko Epson Corporation 0x3047 Unknown' (focused)
Current mode: 1366x768 @ 60.002 Hz
Power: on
Position: 0,0
Scale factor: 1.000000
Scale filter: nearest
Subpixel hinting: rgb
Transform: normal
Workspace: 2
Max render time: off
Adaptive sync: disabled
Allow tearing: no
Available modes:
1366x768 @ 60.002 Hz
Single physical display of the laptop
Currently we are seeing only one display output. Our goal is to create a second virtual display that we will then share on the tablet/phone.
To do this there are various tools available. We are using sway-vdctl . It is currently not available within Debian packages, so we need to install it manually.
$ vdctl --help
Usage: vdctl [OPTIONS] <ACTION> [VALUE]
Arguments:
<ACTION>
Possible values:
- create: Create new output based on a preset
- kill: Terminate / unplug an active preset
- list: List out active presets
- next-number: Manually set the next output number, in case something breaks
- sync-number: Sync the next output number using 'swaymsg -t get_outputs'
[VALUE]
Preset name to apply, alternatively a value
[default: ]
Options:
--novnc
do not launch a vnc server, just create the output
-h, --help
Print help (see a summary with '-h')
Before creating the virtual display, we need to set it's properties at .config/vdctl/config.json . I am using Xiaomi Pad 6 tablet as my external display. You can adjust the properties according to the device you want to use as a second display.
In the JSON, you can set the display resolution according to your external device and other configurations. If you want to configure multiple displays, you can add another entry into the presets in the json file. You can refer to example json file into the git repository.
Now we need to actually create the virtual monitor.
$ vdctl create pad6
Created output, presumably 'HEADLESS-1'
Set resolution of 'HEADLESS-1' to 2800x1800
Set scale factor of 'HEADLESS-1' to 2
Preset 'pad6' ('HEADLESS-1': 2800x1800) is now active on port 9901
Now if you will check the display outputs in your display settings or from command line, you will see two different displays.
$ swaymsg -t get_outputs
Output LVDS-1 'Seiko Epson Corporation 0x3047 Unknown'
Current mode: 1366x768 @ 60.002 Hz
Power: on
Position: 0,0
Scale factor: 1.000000
Scale filter: nearest
Subpixel hinting: rgb
Transform: normal
Workspace: 2
Max render time: off
Adaptive sync: disabled
Allow tearing: no
Available modes:
1366x768 @ 60.002 Hz
Output HEADLESS-1 'Unknown Unknown Unknown' (focused)
Current mode: 2800x1800 @ 0.000 Hz
Power: on
Position: 1366,0
Scale factor: 2.000000
Scale filter: nearest
Subpixel hinting: unknown
Transform: normal
Workspace: 3
Max render time: off
Adaptive sync: disabled
Allow tearing: no
Also in the display settings.
Display settings on Wayland with physical and virtual monitor output
Now we need to make this virtual display available over VNC which we will access with a VNC client on the tablet. To accomplish this I am using wayvnc but you can use any VNC server package.
Install wayvnc
$ sudo apt install wayvnc
Now we will serve our virtual display HEADLESS-1 with wayvnc.
$ wayvnc -o HEADLESS-1 0.0.0.0 5900
You can adjust the port number as per your need.
The process from laptop side is done.
Now install any VNC software on your tablet. I am using AVNC, which is available on F-Droid.
In the VNC software interface, add a new connection with the IP address of your laptop and the port started by wayvnc. Remember, both your laptop and phone need to be on the same Wi-Fi network.
AVNC interface with the connection details to connect to the virtual monitor.
Save and connect. Now you will be able to see a extended display on your tablet.
Enjoy working with multiple screens in a portable setup.
If your bank is like mine, its website doesn’t allow you to copy your password and paste it by performing a simple Ctrl+V. I tried the Don’t Fuck With Paste extension in Firefox, which could paste my bank account’s profile password but not the login password.
Therefore, I asked on Mastodon a couple of days ago and got some responses. The solution that worked for me was to use Shift+Insert to paste the password. It worked for me in LibreWolf and Firefox, and that’s all I needed.
Furthermore, this behavior by bank websites leads to users choosing insecure and memorable passwords. Using this trick will help you choose strong passwords for your bank account.
I prefer to use random and strong passwords generated using the password manager pass. It is a freedom-respecting software, unlike popular proprietary password managers promoted by YouTubers. Feel free to check out their webpage here. The reason I use pass is that it stores all the passwords locally (and optionally in a remote Git repository) in encrypted form, which can only be decrypted using your private GPG keys.
I have been using Disroot as my primary email ever since
openmailbox.org stopped. I am very grateful for Disroot’s service and
I occasionally donate to them.
Recently, my Disroot inbox has been flooded with spam. On an average
day, I used to receive around 90% spams on entire email
count. However, the situation has improved since then. I contacted the
Disroot team, and they informed me that they are aware of the
situation and planning to migrate to Rspamd from Spamassassin.
I don’t know whether they deployed Rspamd, even if so that only going
to process incoming mails, I am looking for a way to identify spams
and purge that are already entered my Imap folders.
Later I found this script nh2/rspamd-move[1], which seems fit my need.
I made couple of trivial changes in the script for my use case. I
wasn’t sure of directly running this on my Mail/ dir, so I cloned my
entire local mail directory to another directory and made available to
podman container where I script and rspamd instance exist. I trained
rspamd from the /Spam. Later, I manually moved couple of mails to
/spam folder/. I requested friends to share their spam folder in the
#debian-in channel, but that didn’t happen :P
$podman run -it --mount
type=bind,source=/home/abhijith/$MAILS/,target=/container-mail-clone
id:latest
$script.py
(It took some time since I have around 10000+ emails)
Wow, it was quite a successful attempt, I was able to catch most of it
and move to spam/ and couple of false positive in a different
folder. Now I want to do the same in the actual maildir yet very
skeptical. While going through the cloned folder with mutt -f I
remembered that the mails are already indexed by notmuch.
So all I need to do is operate tagging and deletion with notmuch and
it will be synced back to the original mail dir. Ta-da. I cleaned by
Inbox.
As i was unable to figure out the errors building the nodejs flatpak apps from source, I have patched the upstream project’s electron build system to support aarch64 linux binaries (both deb & rpm). This enabled me to support the respective flatpak binary starting with the v0.32.0 release. From the packaging side, I have updated the flatpak manifest & update script to support the new architecture.
I do not have an aarch64 hardware to test the build, Hence. I reached out to fellow fediverse users who could lend a hand by testing it. Fortunately, I quickly got a respose from a kind human who tested it & confirmed that the application is indeed working!
In the meanwhile, Frappe Books has reached 3000+ downloads via flatub! This update will enable a few more users to try out the application.
Most of our mapping parties, if not all, start with a brief introduction. The newbies are informed about the various benefits of using and contributing to OpenStreetMap, such as massive improvements to the individual’s privacy and an easy mechanism to correct data.
However, I have been wondering if this approach is the optimal path. This doubt started nagging me after I picked up The Theory of the Leisure Class by Thorstein Veblen. If class distinctions are really so pervasive as theorized in the book, shouldn’t we try to incorporate these findings in our promotion of OSM in mapping parties and everywhere else?
A clear description of the context would be in order. Though our existing method of extolling the benefits of OSM is good, I don’t think it is the best one for India. India has, unfortunately, one of the lowest proportion of people contributing to social activities. In conversation with my friends, I often find them considering the idea of “doing something for free” repugnant. Maybe its due to the oppressive nature of the Indian classes, where people’s aspirations are mostly reduced to the singular objective of rising above their current class. Whatever is the reason, we can at least conclude that the current system of promoting OSM is unsatisfactory in the context of India.
We can, for instance, try to frame OSM as a hobby and actively compare the intensity of mapping activity with other mappers (say, by focusing on the heat map that is displayed on the OSM profile page). Setting aside the moral considerations this entails, I believe this approach is likely to bring some interesting results. People may or may not be excited by the idea of increasing their reputation by performing conspicuous leisure in the form of contributions. However, it must be tested on field before we derive any conclusions.
Okay, here’s the deal, I pushed my first post on Reimagined Doodle - Alias Command, five years ago on July 8th, 2020. Don’t think I ever mentioned that post started out as a Github Gist which I later transferred here seeking a more long-term home on an independent platform.
Writing about writings, motivations, and the blog itself has been a recurring theme here over the years. 123456789
I’m unsure how I sustained expressing myself and writing here for this long. Now and then, I go months without any thought of writing, and then all of a sudden I start in bursts with sequential posts one after another. There isn’t a pattern per se in topics other than whatever burning question I have at the moment.
Typesetters did not like the laser printer. Wedding photographers still hate the iphone. And some musicians are outraged that AI is now making mediocre pop music.
In the article, Seth connected how AI is increasing productivity and how anything that improves productivity always wins.
Nowadays, large language models (LLMs) have become synonymous with AI, while AI is a broader field. AI has brought a shift in how things are done. Use cases might vary, but it’s helping in ways like quickly summarizing huge knowledge bases to answer questions or, in my case, helping understand the contextual meaning of complex word (or sentence) usage in language and literature in both English and Hindi, which was sometimes not easy to comprehend with simple web search results.
Even if you or I don’t really like “AI in everything”, we can’t deny the fact that AI is here to stay. This doesn’t take away from the fact that AI needs to become ethical, regulated, and environmentally sustainable.
Nope. It was mostly a failure. Though I did meet a strong chess player. Unfortunately, that person is mostly interested in antichess, while I like classical chess and chess 960.
In the past few months, I have moved authoritative name servers (NS) of two of my domains (sahilister.net and sahil.rocks) in house using PowerDNS. Subdomains of sahilister.net see roughly 320,000 hits/day across my IN and DE mirror nodes, so adding secondary name servers with good availability (in addition to my own) servers was one of my first priorities.
I explored the following options for my secondary NS, which also didn’t cost me anything:
One has to delegate NS towards one or more of ns[1-5]he.net to verify ownership. It does lead to a minor lame server period between NS addition and first zone transfer.
ns-global.kjsl.com uses Afraid.org, Puck and their NS for their own zone.
Asking friends
Two of my friends and fellow mirror hosts have their own authoritative name server setup, Shrirang (ie albony) and Luke. Shirang gave me another POP in IN and through Luke (who does have an insane amount of in-house NS, see dig ns jing.rocks +short), I added a JP POP.
If we know each other, I would be glad to host a secondary NS for you in (IN and/or DE locations).
Some notes
Adding a third-party secondary is putting trust that the third party would serve your zone right.
Hurricane Electric and 1984 hosting provide multiple NS. One can use some or all of them. Ideally, you can get away with just using your own with full set from any of these two. Play around with adding and removing secondaries, which gives you the best results. . Using everyone is anyhow overkill, unless you have specific reasons for it.
Moving NS in-house isn’t that hard. Though, be prepared to get it wrong a few times (and some more). I have already faced partial outages because:
Recursive resolvers (RR) in the wild behave in a weird way and cache the wrong NS response for longer time than in TTL.
NS expiry took more than time. 2 out of 3 of my Netim’s NS (my domain registrar) had stopped serving my domain, while RRs in the wild hadn’t picked up my new in-house NS. I couldn’t really do anything about it, though.
Dot is pretty important at the end.
With HE.net, I forgot to delegate my domain on their panel and just added in my NS set, thinking I’ve already done so (which I did but for another domain), leading to a lame server situation.
In terms of serving traffic, there’s no distinction between primary and secondary NS. RR don’t really care who they’re asking the query to. So one can have hidden primary too.
I initially thought of adding periodic RIPE Atlas measurements from the global set but thought against it as I already host a termux mirror, which brings in thousands of queries from around the world leading to a diverse set of RRs querying my domain already.
In most cases, query resolution time would increase with out of zone NS servers (which most likely would be in external secondary). 1 query vs. 2 queries. Pay close attention to ADDITIONAL SECTION Shrirang’s case followed by mine:
$ dig ns albony.in
; <<>> DiG 9.18.36 <<>> ns albony.in
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60525
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 9
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;albony.in. IN NS
;; ANSWER SECTION:
albony.in. 1049 IN NS ns3.albony.in.
albony.in. 1049 IN NS ns4.albony.in.
albony.in. 1049 IN NS ns2.albony.in.
albony.in. 1049 IN NS ns1.albony.in.
;; ADDITIONAL SECTION:
ns3.albony.in. 1049 IN AAAA 2a14:3f87:f002:7::a
ns1.albony.in. 1049 IN A 82.180.145.196
ns2.albony.in. 1049 IN AAAA 2403:44c0:1:4::2
ns4.albony.in. 1049 IN A 45.64.190.62
ns2.albony.in. 1049 IN A 103.77.111.150
ns1.albony.in. 1049 IN AAAA 2400:d321:2191:8363::1
ns3.albony.in. 1049 IN A 45.90.187.14
ns4.albony.in. 1049 IN AAAA 2402:c4c0:1:10::2
;; Query time: 29 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Fri Jul 04 07:57:01 IST 2025
;; MSG SIZE rcvd: 286
vs mine
$ dig ns sahil.rocks
; <<>> DiG 9.18.36 <<>> ns sahil.rocks
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64497
;; flags: qr rd ra; QUERY: 1, ANSWER: 11, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;sahil.rocks. IN NS
;; ANSWER SECTION:
sahil.rocks. 6385 IN NS ns5.he.net.
sahil.rocks. 6385 IN NS puck.nether.net.
sahil.rocks. 6385 IN NS colin.sahilister.net.
sahil.rocks. 6385 IN NS marvin.sahilister.net.
sahil.rocks. 6385 IN NS ns2.afraid.org.
sahil.rocks. 6385 IN NS ns4.he.net.
sahil.rocks. 6385 IN NS ns2.albony.in.
sahil.rocks. 6385 IN NS ns3.jing.rocks.
sahil.rocks. 6385 IN NS ns0.1984.is.
sahil.rocks. 6385 IN NS ns1.1984.is.
sahil.rocks. 6385 IN NS ns-global.kjsl.com.
;; Query time: 24 msec
;; SERVER: 127.0.0.53#53(127.0.0.53) (UDP)
;; WHEN: Fri Jul 04 07:57:20 IST 2025
;; MSG SIZE rcvd: 313
Theoretically speaking, a small increase/decrease in resolution would occur based on the chosen TLD and the popularity of the TLD in query originators area (already cached vs. fresh recursion).
One can get away with having only 3 NS (or be like Google and have 4 anycast NS or like Amazon and have 8 or like Verisign and make it 13 :P).
Nowhere it’s written, your NS needs not to be called dns* or ns1, ns2 etc. Get creative with naming NS; be deceptive with the naming :D.
A good understanding of RR behavior can help engineer a good authoritative NS system.
I recently shifted my site from insaan.codeberg.page to khubsuratinsaan.codeberg.page. My site will continue to exist at the old URL till someone claims it. Please update your bookmark and RSS feed.
The Centre for Development Economics at Delhi School of Economics is a research institute funded by the central government to conduct research in Economics. A few days ago, Mrs Rubina, my microeconomics professor, shared an invitation from CDE about a ‘social experiment.’ The language of the invitation was very vague, and I was unable to determine if the students would be subjects or moderators in the project. Though the idea of being a subject is less enticing than that of being a moderator, it was still preferable to doing nothing. Hence, I signed up for the project and appeared on the campus at the allotted time.
The game started once 3 people arrived in the lab. In the game, we were paired with 2 people from the player pool and emulate 16 rounds of a special type of the “public goods problem.” In each round, every person was given ₹4. Out of these ₹4, a person could donate an amount x, double it, and distribute it among the other two players. As the instructions put it: the return on investment is zero. I quickly understood that the socially optimal decision would be for each person to donate all of their wealth, and the Nash equilibrium would be achieved by each person donating nothing.
Since I was in my rebel mode, I decided to donate all of my money in almost all of the rounds. Result: I got ₹29 at the end of the experiment, while player 3 got more than ₹100. You might be wondering, how was I able to get those ₹29? The simple answer is that player 1 also decided to contribute some money, though they followed the strategy of donating nothing for most of the rounds. A more nuanced answer would also involve why they contributed that money. Unfortunately, I missed the chance to talk to them after the experiment and, hence, that question would remain unanswered.
This was my first time experiencing a social experiment in a laboratory. Even though I was just a subject, I learned a lot of things from it. I spotted that the moderators were cutting corners on some fronts, though I admired the length of distance they were maintaining between themselves and the subjects. I noticed some difference in the way the researcher treated the winners and the losers. I saw that they were using a locally hosted website for the game and Google Forms to collect non-game data. (Ugh.) And, of course, I came to know through talking to other people that most people indeed donated almost nothing in the experiment.
At the end of the experiment, I was asked “keeping in view this experiment, rate the trustworthiness of people.” I reminded myself of how player 1 gave me money though it resulted in so many losses for them. Finally I chose a score of 4 out of 5.
Maharashtra is a state here in India, which has Mumbai, the financial capital of India, as its capital. maharashtra.gov.in is the official website of the State Government of Maharashtra. We’re going to talk about authoritative name servers serving it (and bunch of child zones under maharashtra.gov.in).
$ dig +trace maharashtra.gov.in
; <<>> DiG 9.18.33-1~deb12u2-Debian <<>> +trace maharashtra.gov.in
;; global options: +cmd
. 33128 IN NS j.root-servers.net.
. 33128 IN NS h.root-servers.net.
. 33128 IN NS l.root-servers.net.
. 33128 IN NS k.root-servers.net.
. 33128 IN NS i.root-servers.net.
. 33128 IN NS g.root-servers.net.
. 33128 IN NS f.root-servers.net.
. 33128 IN NS e.root-servers.net.
. 33128 IN NS b.root-servers.net.
. 33128 IN NS d.root-servers.net.
. 33128 IN NS c.root-servers.net.
. 33128 IN NS m.root-servers.net.
. 33128 IN NS a.root-servers.net.
. 33128 IN RRSIG NS 8 0 518400 20250704050000 20250621040000 53148 . pGxGZftwj+6VNTSQtstTKVN95Z7/b5Q8GSjRCXI68GoVYbVai9HNelxs OGIRKL4YmSrsiSsndXuEsBuvL9QvQ+qbybNLkekJUAiicKYNgr3KM3+X 69rsS9KxHgT2T8/oqG8KN8EJLJ8VkuM2PJ2HfSKijtF7ULtgBbERNQ4i u2I/wQ7elOyeF2M76iEOa7UGhgiBHSBqPulsbpnB//WbKL71yyFhWSk0 tiFEPuZM+iLrN2qBsElriF4kkw37uRHq8sSGcCjfBVdkpbb3/Sb3sIgN /zKU17f+hOvuBQTDr5qFIymqGAENA5UZ2RQjikk6+zK5EfBUXNpq1+oo 2y64DQ==
;; Received 525 bytes from 9.9.9.9#53(9.9.9.9) in 3 ms
in. 172800 IN NS ns01.trs-dns.com.
in. 172800 IN NS ns01.trs-dns.net.
in. 172800 IN NS ns10.trs-dns.org.
in. 172800 IN NS ns10.trs-dns.info.
in. 86400 IN DS 48140 8 2 5EE4748C2069B99C98BC39A56881A64AF17CC78711E6297D43AC5A4F 4B5BB6E5
in. 86400 IN RRSIG DS 8 1 86400 20250704050000 20250621040000 53148 . jkCotYosapreoKKPvr9zPOEDECYVe9OtJLjkQbFfTin8uYbm/kdWzieW CkN5sabif5IHTFU4FEVOShfu4DFeUolhNav56TPKjGqEGjQ7qCghpqTj dNN4iY2s8BcJ2ujHwhm6HRfdbQRVoKYQ73UUZ+oWSute6lXWHE9+Snk2 1ZCAYPdZ2s1s7NZhrZW2YXVw/nHIcRl/rHqWIQ9sgUlsd6MwmahcAAG+ v15HG9Q48rCG1A2gJlJPbxWpVe0EUEu8LzDsp+ORqy1pHhzgJynrJHJz qMiYU0egv2j7xVPSoQHXjx3PG2rsOLNnqDBYCA+piEXOLsY3d+7c1SZl w9u66g==
;; Received 679 bytes from 199.7.83.42#53(l.root-servers.net) in 3 ms
maharashtra.gov.in. 900 IN NS ns8.maharashtra.gov.in.
maharashtra.gov.in. 900 IN NS ns9.maharashtra.gov.in.
maharashtra.gov.in. 900 IN NS ns10.maharashtra.gov.in.
maharashtra.gov.in. 900 IN NS ns18.maharashtra.gov.in.
maharashtra.gov.in. 900 IN NS ns20.maharashtra.gov.in.
npk19skvsdmju264d4ono0khqf7eafqv.gov.in. 300 IN NSEC3 1 1 0 - P0KKR4BMBGLJDOKBGBI0KDM39DSM0EA4 NS SOA MX TXT RRSIG DNSKEY NSEC3PARAM
npk19skvsdmju264d4ono0khqf7eafqv.gov.in. 300 IN RRSIG NSEC3 8 3 300 20250626140337 20250528184339 48544 gov.in. Khcq3n1Jn34HvuBEZExusVqoduEMH6DzqkWHk9dFkM+q0RVBYBHBbW+u LsSnc2/Rqc3HAYutk3EZeS+kXVF07GA/A486dr17Hqf3lHszvG/MNT/s CJfcdrqO0Q8NZ9NQxvAwWo44bCPaECQV+fhznmIaVSgbw7de9xC6RxWG ZFcsPYwYt07yB5neKa99RlVvJXk4GHX3ISxiSfusCNOuEKGy5cMxZg04 4PbYsP0AQNiJWALAduq2aNs80FQdWweLhd2swYuZyfsbk1nSXJQcYbTX aONc0VkYFeEJzTscX8/wNbkJeoLP0r/W2ebahvFExl3NYpb7b2rMwGBY omC/QA==
npk19skvsdmju264d4ono0khqf7eafqv.gov.in. 300 IN RRSIG NSEC3 13 3 300 20250718144138 20250619135610 22437 gov.in. mbj7td3E6YE7kIhYoSlDTZR047TXY3Z60NY0aBwU7obyg5enBQU9j5nl GUxn9zUiwVUzei7v5GIPxXS7XDpk7g==
6bflkoouitlvj011i2mau7ql5pk61sks.gov.in. 300 IN NSEC3 1 1 0 - 78S0UO5LI1KV1SVMH1889FHUCNC40U6T TXT RRSIG
6bflkoouitlvj011i2mau7ql5pk61sks.gov.in. 300 IN RRSIG NSEC3 8 3 300 20250626133905 20250528184339 48544 gov.in. M2yPThQpX0sEf4klooQ06h+rLR3e3Q/BqDTSFogyTIuGwjgm6nwate19 jGmgCeWCYL3w/oxsg1z7SfCvDBCXOObH8ftEBOfLe8/AGHAEkWFSu3e0 s09Ccoz8FJiCfBJbbZK5Vf4HWXtBLfBq+ncGCEE24tCQLXaS5cT85BxZ Zne6Y6u8s/WPgo8jybsvlGnL4QhIPlW5UkHDs7cLLQSwlkZs3dwxyHTn EgjNWClhghGXP9nlvOlnDjUkmacEYeq5ItnCQjYPl4uwh9fBJ9CD/8LV K+Tn3+dgqDBek6+2HRzjGs59NzuHX8J9wVFxP7/nd+fUgaSgz+sST80O vrXlHA==
6bflkoouitlvj011i2mau7ql5pk61sks.gov.in. 300 IN RRSIG NSEC3 13 3 300 20250718141148 20250619135610 22437 gov.in. raWzWsQnPkXYtr2v1SRH/fk2dEAv/K85NH+06pNUwkxPxQk01nS8eYlq BPQ41b26kikg8mNOgr2ULlBpJHb1OQ==
couldn't get address for 'ns18.maharashtra.gov.in': not found
couldn't get address for 'ns20.maharashtra.gov.in': not found
;; Received 1171 bytes from 2620:171:813:1534:8::1#53(ns10.trs-dns.org) in 0 ms
;; communications error to 10.187.202.24#53: timed out
;; communications error to 10.187.202.24#53: timed out
;; communications error to 10.187.202.24#53: timed out
;; communications error to 10.187.202.28#53: timed out
;; communications error to 10.187.203.201#53: timed out
;; no servers could be reached
Quick takeaways:
5 authoritative NS are listed ie:
ns8.maharashtra.gov.in.
ns9.maharashtra.gov.in.
ns10.maharashtra.gov.in.
ns18.maharashtra.gov.in.
ns20.maharashtra.gov.in.
No address (no A/AAAA records) could be found for ns18.maharashtra.gov.in and ns20.maharashtra.gov.in. Internet Archive snapshots for bgp.tools at time of writing NS18 and NS20.
“communications error to 10.187.202.24#53: timed out”, “communications error to 10.187.202.28#53: timed out” and “communications error to 10.187.203.201#53: timed out” is likely due to RFC 1918 records for NS. Ofcourse, they will never respond on public internet.
Not in trace, but NS10 has private or empty A/AAAA record against it (detailed further down).
The query resolution failed with “no servers could be reached” ie we didn’t recieved any A/AAAA record for that query.
It’s a hit or miss for this DNS query resolution.
Looking at in zone data
Let’s look at NS added in zone itself (with 9.9.9.9):
$ dig ns maharashtra.gov.in
; <<>> DiG 9.18.33-1~deb12u2-Debian <<>> ns maharashtra.gov.in
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 172
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 3
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;maharashtra.gov.in. IN NS
;; ANSWER SECTION:
maharashtra.gov.in. 300 IN NS ns8.maharashtra.gov.in.
maharashtra.gov.in. 300 IN NS ns9.maharashtra.gov.in.
;; ADDITIONAL SECTION:
ns9.maharashtra.gov.in. 300 IN A 10.187.202.24
ns8.maharashtra.gov.in. 300 IN A 10.187.202.28
;; Query time: 180 msec
;; SERVER: 9.9.9.9#53(9.9.9.9) (UDP)
;; WHEN: Sat Jun 21 23:00:49 IST 2025
;; MSG SIZE rcvd: 115
Pay special attention to “ADDITIONAL SECTION”. Running dig ns9.maharashtra.gov.in and dig ns8.maharashtra.gov.in, return RFC 1918 ie these private addresses. This is coming from zone itself, so in zone A records of NS8 and NS9 point to 10.187.202.28 and 10.187.202.24 respectively.
Cloudflare’s 1.1.1.1 has a slightly different version:
$ dig ns maharashtra.gov.in @ns01.trs-dns.net.
; <<>> DiG 9.18.36 <<>> ns maharashtra.gov.in @ns01.trs-dns.net.
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56535
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 5, ADDITIONAL: 6
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: f13027aa39632404010000006856fa2a9c97d6bbc973ba4f (good)
;; QUESTION SECTION:
;maharashtra.gov.in. IN NS
;; AUTHORITY SECTION:
maharashtra.gov.in. 900 IN NS ns8.maharashtra.gov.in.
maharashtra.gov.in. 900 IN NS ns18.maharashtra.gov.in.
maharashtra.gov.in. 900 IN NS ns10.maharashtra.gov.in.
maharashtra.gov.in. 900 IN NS ns9.maharashtra.gov.in.
maharashtra.gov.in. 900 IN NS ns20.maharashtra.gov.in.
;; ADDITIONAL SECTION:
ns20.maharashtra.gov.in. 900 IN A 52.183.143.210
ns18.maharashtra.gov.in. 900 IN A 35.154.30.166
ns10.maharashtra.gov.in. 900 IN A 164.100.128.234
ns9.maharashtra.gov.in. 900 IN A 103.23.150.89
ns8.maharashtra.gov.in. 900 IN A 103.23.150.88
;; Query time: 28 msec
;; SERVER: 64.96.2.1#53(ns01.trs-dns.net.) (UDP)
;; WHEN: Sun Jun 22 00:00:02 IST 2025
;; MSG SIZE rcvd: 248
The ADDITIONAL SECTION gives a completely different picture (different from in zone NSes).
Maybe this was how it was supposed to be, but none of the IPs listed for NS10, NS18 and NS20 are responding to any DNS query.
Assuming NS8 as 103.23.150.88 and NS9 as 103.23.150.89, checking SOA on each gives following:
NS8 (which is marked as primary in SOA) has serial 2013116777 and NS9 is on serial 2013116757, so looks like the sync (IXFR/AXFR) between primary and secondary is broken. That’s why NS8 and NS9 are serving different responses, evident from the following:
This is the reason for difference in 1.1.1.1 and 9.9.9.9 responses in previous section.
To summarize:
Primary and secondary NS aren’t in sync. Serials aren’t matching, while NS8 and NS9 are responding differently for same queries.
NSes have A records with private address, not reachable on the internet, so lame servers.
Incomplete NS address, not even FQDN in some cases.
Difference between NS delegated in parent zone and NS added in actual zone.
Name resolution works in very particular order (in my initial trace it failed).
Initially, I thought of citing RFCs, but I don’t really think it’s even required.
1.1.1.1, 8.8.8.8 and 9.9.9.9 are handling (lame servers, this probelm) well, handing out the A record for the main website, so dig maharashtra.gov.in would mostly pass and that was the reason I started this post with +trace to recurse the complete zone to show the problem.
I have sent the following email to address listed in SOA:
Subject - maharashtra.gov.in authoritative DNS servers not reachable
Hello,
I wanted to highlight the confusing state of maharashtra.gov.in authoritative DNS servers.
Parent zone list following as name servers for your DNS zone:
ns8.maharashtra.gov.in.
ns18.maharashtra.gov.in.
ns10.maharashtra.gov.in.
ns9.maharashtra.gov.in.
ns20.maharashtra.gov.in.
Out of these, ns18 and ns20 don’t have public A/AAAA records and are thus not reachable.
ns10 keeps on shuffling between NO A record and 10.187.203.201 (private, not reachable address).
ns8 keeps on shuffling between 103.23.150.88 and 10.187.202.28 (private, not reachable address).
ns9 keeps on shuffling between 103.23.150.89 and 10.187.202.24 (private, not reachable address).
These are leading to long, broken, or no DNS resolution for the website(s).
Can you take a look at the problem?
Regards,
Sahil
I’ll update here if I get a response. Hopefully, they’ll listen and fix their problem.
In December 2024, my friend Badri and I were planning a trip to Southeast Asia. At this point, we were planning to visit Singapore, Malaysia and Vietnam. My Singapore visa had already been approved, and Malaysia was visa-free for us. For Vietnam, we had to apply for an e-visa online.
We considered adding Brunei to our itinerary. I saw some videos of the Brunei visa process and got the impression that we needed to go to the Brunei embassy in Kuching, Malaysia in person.
However, when I happened to search for Brunei on Organic Maps1, I stumbled upon the Brunei Embassy in Delhi. It seemed to be somewhere in Hauz Khas. As I was going to Delhi to collect my Singapore visa the next day, I figured I’d also visit the Brunei Embassy to get information about the visa process.
The next day I went to the location displayed by Organic Maps. It was next to the embassy of Madagascar, and a sign on the road divider confirmed that I was at the right place.
That said, it actually looked like someone’s apartment. I entered and asked for directions to the Brunei embassy, but the people inside did not seem to understand my query. After some back and forth, I realized that the embassy wasn’t there.
I now searched for the Brunei embassy on the Internet, and this time I got an address in Vasant Vihar. It seemed like the embassy had been moved from Hauz Khas to Vasant Vihar. Going by the timings mentioned on the web page, the embassy was closing in an hour.
I took a Metro from Hauz Khas to Vasant Vihar. After deboarding at the Vasant Vihar metro station, I took an auto to reach the embassy. The address listed on the webpage got me into the correct block. However, the embassy was still nowhere to be seen. I asked around, but security guards in that area pointed me to the Burundi embassy instead.
After some more looking around, I did end up finding the embassy. I spoke to the security guards at the gate and told them that I would like to know the visa process. They dialled a number and asked that person to tell me the visa process.
I spoke to a lady on the phone. She listed the documents required for the visa process and mentioned that the timings for visa application were from 9 o’clock to 11 o’clock in the morning. She also informed me that the visa fees was ₹1000.
I also asked about the process Badri, who lives far away in Tamil Nadu and cannot report at the embassy physically. She told me that I can submit a visa application on his behalf, along with an authorization letter.
Having found the embassy in Delhi was a huge relief. The other plan - going to Kuching, Malaysia - was a bit uncertain, and we didn’t know how much time it would take. Getting our passport submitted at an embassy in a foreign country was also not ideal.
A few days later, Badri sent me all the documents required for his visa. I went to the embassy and submitted both the applications. The lady who collected our visa submissions asked me for our flight reservations from Delhi to Brunei, whereas ours were (keeping with our itinerary) from Kuala Lampur. She said that she might contact me later if it was required.
For reference, here is the list of documents we submitted -
Visa application form
Passport
A photocopy of passport
Authorization letter from Badri (authorizing me to submit his application on his behalf)
Airline ticket itinerary
Hotel bookings
Cover letter
2 photos
Proof of employment
6 months bank statement (they specifically asked for ₹1,00,000 or more in bank balance)
I then asked about the procedure to collect the passports and visa results. Usually, embassies will tell you that they will contact you when they have decided on your applications. However, here I was informed that if they don’t contact me within 5 days, I can come and collect our passports and visa result between 13:30-14:30 hours on the fifth day. That was strange :)
I did visit the embassy to collect our visa results on the fifth day. However, the lady scolded me for not bringing the receipt she gave me. I was afraid that I might have to go all the way back home and bring the receipt to get our passports. The travel date was close, and it would take some time for Badri to receive his passport via courier as well.
Fortunately, she gave me our passports (with the visa attached) and asked me to share a scanned copy of the receipt via email after I get home.
We were elated that our visas were approved. Now we could focus on booking our flights.
If you are going to Brunei, remember to fill their arrival card from the website within 48 hours of your arrival!
Thanks to Badri and Contrapunctus for reviewing the draft before publishing the article.
Nowadays, I prefer using Comaps instead of Organic Maps and recommend you do the same. Organic Maps had some issues with its governance and the community issues weren’t being addressed. ↩︎
I find the case of the .UA country code top level domain (ccTLD) interesting simply because of the different name server secondaries they have now. Post Russian invasion, the cyber warfare peaked, and critical infrastructure like getting one side ccTLD down would be big news in anycase.
Most (g/cc)TLDs are served by two (and less likely) by three or more providers. Even in those cases, not all authoritative name servers are anycasted.
ns1.dns.nl is SIDN which also manages their registry.
ns3.dns.nl is ReCodeZero/ipcom, another anycast secondary.
ns4.dns.nl is CIRA, anycast secondary. That’s 3 diverse, anycast networks to serve the .NL ccTLD. .DE has a bit more at name servers at 6 but only 3 seems anycasted.
Now let’s take a look at .UA. Hostmaster LLC is the registry operator of the .UA ccTLD since 2001.
$ dig soa ua +short
in1.ns.ua. domain-master.cctld.ua. 2025061434 1818 909 3024000 2020
Shows in1.ns.ua as primary nameserver (which can be intentionally deceptive too).
Company by Dmitry Kohmanyuk and Igor Sviridov who’re administrative and technical contacts for .UA zone as well as the IANA DB.
ho1.ns.ua by Hostmaster LLC
195.47.253.1
2001:67c:258:0:0:0:0:1
bgp.tools doesn’t mark the prefix as anycast but basis test from various location, this is indeed anycasted (visible in atleast DE, US, UA etc.). Total POPs unknown.
Serving .UA atleast since 2011.
The registry themselves.
bg.ns.ua by ClouDNS
185.136.96.185 and 185.136.97.185
2a06:fb00:1:0:0:0:4:185 and 2a06:fb00:1:0:0:0:2:185
“With more than 36 years of production anycast DNS experience, two of the root name server operators and more than 172 top-level domain registries using our infrastructure, and more than 120 million resource records in service” from https://www.pch.net/services/anycast.
That’s 1 unicast and 6 anycast name servers with hundreds of POPs from 7 different organizations.
Having X number of Point of Presence (POP) doesn’t always mean each location is serving the .UA nameserver prefix.
Number of POPs keeps going up or down based on operational requirements and optimizations.
Highest concentration of DNS queries for a ccTLD would essentially originate in the country (or larger region) itself. If one of the secondaries doesn’t have POP inside UA, the query might very well be served from outside the country, which can affect resolution and may even stop during outages and fiber cuts (which have become common there it seems). - Global POPs do help in faster resolutions for others/outside users though and ofcourse availability.
Having this much diversity does lessen the chance of the ccTLD going down. Theoretically, the adversary has to bring down 7 different “networks/setups” before resolution starts failing (post TTLs expiry).