I had to change my username after I accidentally connected it to my government ID. So this is my new domain. I also took this opportunity to purge all of my blog posts for some obscure reason.
I had to change my username after I accidentally connected it to my government ID. So this is my new domain. I also took this opportunity to purge all of my blog posts for some obscure reason.
It was a busy week. I think it will be until the end of March, till we start our vacation. I managed to workout (P.T.) twice and play once this week. Time spent on reading, media consumption, and painting have been almost zero.
Neck pain and shoulder pain have been part of my occupational side effects. I have made some changes in my posture and working styleto reduce it. But sometime early last year, in 2025, it suddenly shot up to a point where I couldn’t perform day-to-day activities. I couldn’t sleep well, taking care of the baby or the dogs was difficult, and I couldn’t focus. This time, the pain was so much that I just couldn’t tolerate it.
As before, I visited doctors. I visited many times, took their treatments and medication. Followed every instruction given by them. The pain would go away for some time, and then it would come back and shoot up again. This time it was different.
Along with the pain, I think it was also the peak travel and work stress period. I had to go to Chennai and then probably to the Kumbh Mela. I was wearing a cervical collar during my Kumbh Mela trip, on a doctor’s advice. I lost the collar during the Kumbh Mela, and the rest of the trip was unbearable. I had to rely on medication, and the return flight was extremely painful. As soon as I returned from Kumbh, I had to travel to Mumbai for work. All I remember is pain.

The pain would shoot up in the cold. I couldn’t sit in the air-conditioning. I couldn’t sit outside at dusk. I had to keep my neck warm all the time. I could barely sleep.
After that, I made many adjustments. I changed my sleeping position to be more friendly to my back, spine, and neck. It did improve a bit, but the pain kept coming back in cycles.
During this painful phase, two things happened. I was at a child’s birthday party, sitting alone. A friend came up and asked if I was grumpy and why I was sitting by myself. I told them I was in a lot of pain and couldn’t focus. Normally, you would rarely see me sitting in a corner or not talking to people.
There were three or four people around, and all of them told me I should try physiotherapy. Most of them were around my age or slightly younger, and all were serious sportspeople, professional or semi-professional. They had rebuilt their bodies through physiotherapy. When all of them said “physio” independently, it struck me that I had to try it.
During my Mumbai visit. A colleague there told me very clearly that I had to invest time in physiotherapy and strength building, and that this was the only long-term solution.
So I started asking around for a good physiotherapist. A friend who runs Pretty Dan Good and has a similar occupational hazard gave me the contact details of Hari Nag, one of the founders of Stairs Physiotherapy. I called him and spoke to him. By his suggestion, I met Omkar at their Ulsoor center.
I was a little hesitant, but I went and met the physiotherapist. We did an evaluation session, which was very painful because I had to do many movements he asked for. My mobility was bad. My strength was bad. Everything around my shoulder and neck hurts. I was clearly in pain.
At the end of the evaluation, he asked me about my goal. For me, the miracle goal was simple: reduce the pain. He told me that consistency would be key.
We did physiotherapy for a month. Then I had to travel again, which broke the routine, and the pain shot up once more. I took a break of about a month, and then restarted, this time with a little more confidence. I was still nowhere near pain-free, and I couldn’t do much with my hands, shoulders, or arms. And there were signs of improvement.
Then Omkar left, and I was handed over to Bhumika’s safe hands. I hadn’t met her before, but she came across as empathetic, approachable, and friendly right away.
We started this phase of the journey in July/2025. The first four months were about building a routine, staying consistent, reducing pain, and slowly improving mobility.
By September, I was more or less pain-free. I started more P.T or Workouts. Looking at my pain tracker today, I’ve been pain-free for the last four months. That is largely thanks to Bhumika. I also have to credit myself for being consistent. But without her empathy, understanding, and encouragement, this wouldn’t have happened. I have deep respect for her professionalism and warmth.
Today, we’ve been working on my shoulder strength and residual pain for about seven months in total. Over the last two to three months, the focus has shifted away from pain reduction, because the pain is almost zero, and toward building strength. We’ve started presses, pulls, and using weights.
Remarkably, I haven’t had pain for the last three to four months. I can lift things with confidence now, and I’m no longer scared of weights or of triggering pain again. In fact, I also rode to Kuppalli. That fear is gone, and for that I’m grateful to Bhumika.




Our focus for 2026 is to continue building strength and reduce body fat percentage (I do carry a very standard Indian dad body fat percentage). I also want to do a long ride next year, so build enough to sustain that.
Along with Bhumika and a bunch of friends who pushed me towards Physiotherapy in the beginning. My friends Sandeep and Sandeep introduced me to pickleball and encouraged me to be active. Manju who accompanied on rides, that helped to build confidence. Anju not only encouraged me but also helped me to eat healthily. I think it all came together. I am very thankful to all of them.
That has been my journey to being pain-free.
As a kid, I always wanted a set of Walkie Talkies to chat with friends. We got cell phones as adults, but that desire remained. A few years back, I took the HAM exam, but then COVID hit us, and I didn’t apply for a call sign. Now I have to retake the exams online, as the system now doesn’t allow me to apply for a call sign with paper exam results. I will take that exam again. But in the meantime, I also wanted something that I could use with friends and family who I don’t think are interested in taking an exam or applying for a license. Hence this search.
I do have a kind of Walkie-talkie in the form of Helmet communications. There are some issues with using it as a general communications device. Some that matter to me are
With all this, I was left to look for a walkie-talkie.
There are two bands used for public, license-free communication without encryption. The Family Radio Service (FRS) is used in the USA and Canada. FRS operates between 462.5625 MHz and 467.7125 MHz. And PMR446 (private mobile radio used in most of Europe and India.
PMR446 is a private mobile radio that operates between 446.0 – 446.2 MHz in India. It’s a license-free band, as per the Gazette Notification G.S.R. 1047(E). Since I am dealing with India, I will focus on it. The rules limit output power to 0.5 W. It doesn’t seem like much, but you can reach a kilometer or more in urban conditions with buildings and trees. A 5KM to 10KM in direct line of sight conditions. It’s much better than my helmet communication system. The rules allow channel spacing of 6.25 kHz (Digital) and 12.5 kHz (analog). The frequency range can accommodate 16 analog or 32 digital channels. I have a dedicated page about the PMR446 band, channels, channel guarding, etc. The most important thing to know is that we need to select walkie-talkies that operate PMR446 in India.
I have shown the snippet from the Gazette and given link to the rules for your reference. Please get your own legal advice. I am not a lawyer, and this is not legal advice.
The protocols are standardized, and most follow the ETSI Harmonised European Standard. Since this is something all vendors use, if someone wants to build, the protocol is not a secret sauce. This also makes the technology and walkies vendor-neutral.
There is no encryption on PMR446. So you shouldn’t communicate anything that needs encryption on these bands. There is no privacy. There are ways to keep a set of people independent by using a specific channel and Squelch (CTSS or DCS). Squelch is called PL (Private Line) tone, CG (Channel Guard) tone, or QC (Quiet Channel) tone, depending on the vendor, but all refer to the same functionality. Basically, you use a channel and a specific CTSS or DCS code to keep your conversations independent from others. This setup doesn’t stop others from using the same combo and listening to you.
Armed with this information and requirement, I started my search, and my final list was
If I had money, I would have tried each of them and then decided which to go with. Based on the information I found online, I went with the T82 by Motorola. If you have any other model listed here, let me know, and we can test them together.


In terms of cost, it wasn’t cheap; a pair of them cost me INR 18,000. It came in a package with two walkies, a carrying case, a charger, NIMH rechargeable batteries, earpieces, belt clips, etc. It’s probably the most expensive pair. G3U or PT100 is half the price.
Should you get it? Maybe. It depends on your need. But once you start using it, you will see how useful it becomes. Especially if you ride or drive a lot in teams, or have a farm or work in a place with poor or no network, trek, or run events, etc. As far as me, I am still going to use BluArmor while riding. But I will surely carry it along with me.
It’s also a good entry point into HAM radio. It’s good enough to generate interest among kids and adults about analog communications.
It’s been a hectic week. I was in Mumbai for a day on Wednesday, a quick but tiring trip. I had so much to do this week that I couldn’t play or do P.T. To be fair, I did go to P.T on Tuesday, but couldn’t go on Thursday. In hindsight, I could have, but I gave more importance to a meeting than it required. Something to remember when I face a similar situation.

I attended the Reclaim Constitution Quiz at the Sabha on Sunday. I thoroughly enjoyed the quiz, conversation, and the meal post the quiz. You can see the highlights of the quiz here. I also made a special appearance answering an audience question. #ReclaimConstitution is a non-commercial initiative to further constitutional literacy. I love their work. Also, they were one of the NMG/2025 grantees.

I spend an embarrassing amount of time in cafes, though honestly, I like the whole concept of a cafe way more than the coffee itself. I know it’s a bit like going to a bar for the water, but the caffeine isn’t really the draw for me. I’m just there for the faces.
I’ve been staying alone in Mumbai/Thane for almost two years now. My social life is pretty much non existent by choice, I guess, but let’s not digress into the why of it all right now.
The point is, I love the ambience.
When I’m tucked away in a corner of a cafe, I don’t feel so lonely; it feels like a safe space. I get to observe so many great personalities, some eventually become “regulars”, some I see every six months, while others just remain figments of my imagination.
I don’t know, man. I just like spending 5 to 6 hours with my laptop, expertly pretending to work. Once in a while, I actually do get some stuff done, but mostly I’m just there for the environment.
At this point, I’m basically part of the furniture (LMAO), and I’m on a first name basis with the staff.
Blue Tokai is the winner for me so far. It helps that there’s a branch barely a kilometer away from my place and the wifi actually holds up. Since I’m not there for the beans, I usually just go for their hot chocolate.
My credit card statement is the only thing side eyeing my choices right now. But hey, if the price of feeling ‘kinda happy’ is a daily hot chocolate, I think I’m fine with the trade off.
I have a sore throat and a cold. I think I got it from Uma, and she got it from school. I have also been talking a lot in meetings this week, and that’s not helping. Also, it’s very cold.

I often find something that still doesn’t feel 100% right. These days, it has been the cold start and the choke. After the bike came out of restoration, it had a cold-start problem. The usual solution was to use the choke without throttle, and that mostly worked.
During the recent six-month service, I complained about it to the mechanic. He said he fixed it and asked me to continue using it as before. But then I couldn’t start by kicking. I had to push in 2nd gear to start it. Even after starting, it would cough and take a couple of minutes to stabilize. My initial doubt was the spark plug (whether it could generate enough spark), then the carburetor. The spark plug was good. Hot kickstart was working. The carburetor seemed fine based on all other parameters.

The only thing I found odd was that just a few meters of push would always start. But the bike would cough, and you could smell petrol after a push start. We have not changed the original Mikuni UCAL carburetors, and I had not used the choke in its previous life, even while riding in the cold mountains. So I went back to basics.
No choke, no throttle, kick, no start.
Again, no choke, no throttle, kick, it starts. That’s good news. I switched off. Came back hours later.
No choke, no throttle, one pseudo-kick, then one smooth full kick. It started like magic.
I could repeat this process many times, and it always worked, even on the coldest day.
So the choke settings are way off; it’s flooding the engine, and the kickstart couldn’t start it. But a pseudo-kick primes the dry engine without flooding, and then the next kick starts it easily. I need to fix the choke settings for days when I really need it.
Sometimes it is just back to basics.


Back in December, I was working to help organize multiple different conferences. One has already happened; the rest are still works in progress. That’s when the thought struck me: why so many conferences, and why do I work for them?
I have been fairly active in the scene since 2020. For most conferences, I usually arrive late in the city on the previous day and usually leave the city on conference close day. Conferences for me are the place to meet friends and new folks and hear about them, their work, new developments, and what’s happening in their interest zones. I feel naturally happy talking to folks. In this case, people inspire me to work. Nothing can replace a passionate technical and social discussion, which stretches way into dinner parties and later.
For most conference discussions now, I just show up without a set role (DebConf is probably an exception to it). It usually involves talking to folks, suggesting what needs to be done, doing a bit of it myself, and finishing some last-minute stuff during the actual thing.
Having more of these conferences and helping make them happen naturally gives everyone more places to come together, meet, talk, and work on something.
No doubt, one reason for all these conferences is evangelism for, let’s say Free Software, OpenStreetMap, Debian etc. which is good and needed for the pipeline. But for me, the primary reason would always be meeting folks.
I have a bunch of screen-casts that I want to release. I have not found a good PeerTube instance to host my videos. I am happy to pay a monthly fee, and I hope one day there will be a platform that provides this.
For now, I will add them to my site, Archive.org, and YouTube. They are all CC-BY-SA.
I am thinking of uploading just one version of each video. No server side transcoding. Hence, I want to convert the videos into the most optimized format and size. I have been doing some experiments and seem to have found decent settings. Its 1080p or 720p with 24 frames.
If its mobile screencast then I will pad them with color, so it can be a proper FHD or HD.
I am going to use WebM as the container with AV1 as video codec and Opus as audio codec. Most screencasts could be just 720p.
This post covers my friend Badri and my experiences in Brunei. Brunei — officially Brunei Darussalam — is a country in Southeast Asia, located on Borneo island. It is one of the few remaining absolute monarchies on Earth.
On the morning of the 10th of December 2024, Badri and I reached Brunei International Airport by taking a flight from Kuala Lumpur. Upon arrival at the airport, we had to go through the immigration, of course. However, I forgot to fill my arrival card, which I filled while I was in the queue for my immigration.
The immigration officer asked me how much cash I was carrying of each currency. After completing the formalities, the immigration officer stamped my passport and let me in. Take a look at Brunei’s entry stamp in my passport.

Brunei entry stamp on my passport. Picture by Ravi Dwivedi, released under CC-BY-SA 4.0.
We exchanged Singapore dollars to get some Brunei dollars at the airport. The Brunei dollar was pegged 1:1 with the Singapore dollar, meaning 1 Singapore dollar equals 1 Brunei dollar. The exchange rate we received at the airport was the same.
Our (pre-booked) accommodation was located near Gadong mall. So, we went to the information center at the airport to ask how to get there by public transport. However, the person at the information center told us that they didn’t know the public transport routes and suggested we take a taxi instead.
We came out of the airport and came across an Indian with a mini bus. He offered to drop us at our accommodation for 10 Brunei dollars (₹630). As we were tired after a sleepless night, we didn’t negotiate and took the offer. It felt a bit weird using the minibus as our private taxi.
In around half-an-hour, we reach our accommodation. The place was more like a guest house than a hotel. In addition to the rooms, it had common space consisting of a hall, a kitchen and a balcony.

Our room in Brunei. Picture by Ravi Dwivedi, released under CC-BY-SA 4.0
Upon reaching the place, we paid for our room in cash, which was 66.70 Singapore dollars (4200 Indian rupees) for two nights. We reached before the check-in time, so we had to wait for our room to get ready before we entered.
The room had a double bed and also a place to hang clothes. We slept for a few hours before going out at night. We went into Gadong mall and had coffee at a café named The Coffee Bean & Tea Leaf. The regular caffe latte I had here been 5.20 Brunei dollars. On another note, the snacks we got us from Kuala Lumpur covered us for the dinner.
The next day—11th of December 2024–we went to a nearby restaurant named Nadj for lunch. The owner was from Kerala. Here we ordered:
So, our lunch cost a total of 12.80 Brunei dollars (825 rupees). The naan was unusually thick, and didn’t like the taste.
After the lunch, we planned to visit Brunei’s famous Omar Ali Saifuddien Mosque. However, a minibus driver outside of Gadong Mall told us that the mosque would be closed in half-an-hour and suggested we visit the nearby Jame’ Asr Hassanil Bolkiah Mosque instead.

Jame’ Asr Hassanil Bolkiah Mosque. Picture by Ravi Dwivedi, released under CC-BY-SA 4.0
He dropped us there for 1 Brunei dollar per person. The person hailed from Uttar Pradesh and told us about bus routes in Hindi. Buses routes in Brunei were confusing, so the information he gave us was valuable.
It was evening, and we had an impression that the mosque and its premises were closed. However, soon enough, we stumbled across an open gate entering the mosque complex. We walked inside for some time, took pictures and exited. Walking in Bandar Seri Begawan wasn’t pleasant, though. The pedestrian infrastructure wasn’t good.
Then we walked back to our place and bought some souvenirs. For dinner and breakfast, we bought bread, fruits and eggs from local shops as we had a kitchen to cook for ourselves.
The guest house also had a washing machine (free of charge) which we wanted to use. However, they didn’t have detergent. Therefore, we went outside to get some detergent. It was 8 o’clock, and most of the shops were closed already. Others had had detergents in large sizes, the ones you would use if you lived there. We ended up getting a small packet at a supermarket.
The next day—12th of December–we had a flight to Ho Chi Minh City in Vietnam with a long layover in Kuala Lumpur. We had breakfast in the morning and took a bus to Omar Ali Saifuddien Mosque. The mosque was in prayer session, so it was closed for Muslims. Therefore, we just took pictures from the outside and took a bus for the airport.

Omar Ali Saifuddien Mosque. Picture by Ravi Dwivedi, released under CC-BY-SA 4.0
When the bus reached near the airport, the bus went straight rather than taking a left turn for the airport. Initially, I thought the bus would just take a turn and come back. However, the bus kept going away from the airport. Confused by this, I asked other passengers if the bus was going to the airport. The driver stopped the bus at Muara Town terminal— 20 km from the airport. At this point, everyone alighted, except for us. The driver went to a nearby restaurant to have lunch.
I felt very uncomfortable stranded in a town which was 20 km from the airport. We had a lot of time, but I was still worried about missing our flight, as I didn’t want to get stuck in Brunei. After waiting for 15 minutes, I went inside the restaurant and reminded the driver that we had a flight in a couple of hours and needed to go to the airport. He said he will leave soon.
When he was done with his lunch, he drove us to the airport. It was incredibly frustrating. On a positive note, we saw countryside of Brunei that we would have seen otherwise. The bus ride cost us 1 Brunei dollar each.

A shot of Brunei’s countryside. Picture by Ravi Dwivedi, released under CC-BY-SA 4.0.
That’s it for this one. Meet you in the next one. Stay tuned for the Vietnam post!
Disclaimer: The goal of this post is not to attack Riseup. In fact, I love Riseup and support their work.
Riseup is an email provider, known for its privacy-friendly email service. The service requires an invite from an existing Riseup email user to get an account.
I created my account on Riseup in the year 2020, of course with the help of a friend who invited me. Since then, I have used the email address only occasionally, although it is logged into my Thunderbird all the time.
Fast-forward to the 4th of January 2026, when Thunderbird suddenly told me that it could not log in to my Riseup account. When I tried logging in using their webmail, it said “invalid password”. Finally, I tried logging in to my account on their website, and was told that…
Log in for that account is temporary suspended while we perform maintenance. Please try again later.
At this point, I suspected that the Riseup service itself was facing some issues. I asked a friend who had an account there if the service was up, and they said that it was. The issue seemed to be specific only to my account.
I contacted Riseup support and informed them of the issue. They responded the next day (the 5th of January) saying:
The my-username-redacted account was found inviting another account that violated our terms of use. As a security measure we suspend all related accounts to ToS violations.
(Before we continue, I would like to take a moment and reflect upon how nice it was to receive response from a human rather than an AI bot—a trend that is unfortunately becoming the norm nowadays.)
I didn’t know who violated their ToS, so I asked which account violated their terms. Riseup told me:
username-redacted@riseup.net attempted to create aliases that could be abused to impersonate riseup itself.
I asked a friend whom I invited a month before the incident, and they confirmed that the username belonged to them. When I asked what they did, they told me they tried creating aliases such as floatup and risedown. I also asked Riseup which aliases violated their terms, but their support didn’t answer this.
I explained to the Riseup support that the “impersonation” wasn’t intentional, that the user hadn’t sent any emails, and that I had been a user for more than 5 years and had donated to them in the past.
Furthermore, I suggested that they should block the creation of such aliases if they think the aliases violate their terms, like how email providers typically don’t allow users to create admin@ or abuse@ email addresses.
After I explained myself, Riseup reinstated my account.
Update on the 10th of January 2025: My friend told me that the alias that violated Riseup’s terms was cloudadmin and his account was reinstated on the 7th of January.
I have the following issues regarding the way the suspension took place —
When I brought up the issue of me getting locked out of my account without a way of downloading my emails or migrating my account, Riseup support responded by saying:
You must understand that we react [by] protecting our service, and therefore we cannot provide notice messages on the affected accounts. We need to act preventing any potential damage to the service that might affect the rest of the users, and that measure is not excessive (think on how abusers/spammers/scammers/etc could trick us and attempt any action before their account is suspended).
This didn’t address my concerns, so let’s move on to the next section.
Here’s how I think Riseup’s ban policy could be changed while still protecting against spammers and other bad actors:
Even if Riseup can’t provide notice to blocked accounts, perhaps they can scale back limitations on the inviting account which wasn’t even involved—for example, by temporarily disabling invites from that account until the issue is resolved.
In this case, the person didn’t impersonate Riseup, so Riseup could have just blocked the aliases and let the user know about it, rather than banning the account outright.
Riseup should give blocked users access to their existing emails so they have a chance to migrate them to a different provider. (Riseup could disable SMTP and maybe incoming emails but keep IMAP access open). I know people who use Riseup for important things such as bank or train tickets, and a sudden block like this is not a good idea.
Riseup should factor in the account profile in making these decisions. I had an account on their service for 5 years and I had only created around 5 invites. (I don’t remember the exact number and there’s no way to retrieve this information.) This is not exactly an attacker profile. I feel long-term users like this deserve an explanation for a ban.
I understand Riseup is a community-run service and does not have unlimited resources like big corporations or commercial email providers do. Their actions felt disproportionate to me because I don’t know what issues they face behind the scenes. I hope someone can help to improve the policies, or at least shed light on why they are the way they are.
Signing off now. Meet you in the next one!
Thanks to Badri and Contrapunctus for reviewing this blog post
Here, I tried to collect entities that owned full /8 IPv4 address block(s) in 2025.
A more comprehensive and historical list can be found at https://en.wikipedia.org/wiki/List_of_assigned_/8_IPv4_address_blocks.
I would have loved to include 4.0.0.0/8 and 8.0.0.0/8 with Lumen/Level 3 or 9.0.0.0/8 with IBM but parts of the address space have been handed out to other entities, like 8.8.4.0/24 and 8.8.8.0/24 for Google Public DNS and 9.9.9.0/24 for Quad9.
Then there were other famous netblocks like 18.0.0.0/8 with MIT and 44.0.0.0/8 which was with Amateur Packet Radio Network broken and brought up by Amazon. Amazon keeps on buying more and more of IPv4 address space. Right now, they’re the second highest IPv4 address space holder with 168+ million addresses under them, right behind the US DoD, which has more due to legacy reasons.
Note - HE’s list mentions addresses originated (not just owned). Providers also advertise prefixes owned by their customers in Bring Your Own IP (BYOIP) setups. The number of address space owned by entity would “mostly” be more than their customer owned space (originated by the entity).
In my last post, Badri and I reached Kuala Lumpur - the capital of Malaysia - on the 7th of December 2024. We stayed in Bukit Bintang, the entertainment district of the city. Our accommodation was pre-booked at “Manor by Mingle”, a hostel where I had stayed for a couple of nights in a dormitory room earlier in February 2024.
We paid 4937 rupees (the payment was online, so we paid in Indian rupees) for 3 nights for a private room. From the Terminal Bersepadu Selatan (TBS) bus station, we took the metro to the Plaza Rakyat LRT station, which was around 500 meters from the hostel. Upon arriving at the hostel, we presented our passports at their request, followed by a 20 ringgit (400 rupee) deposit which would be refunded once we returned the room keys at checkout.

Manor by Mingle - the hostel where we stayed at during our KL transit. Photo by Ravi Dwivedi. Released under the CC-BY-SA 4.0.
Our room was upstairs and it had a bunk bed. I had seen bunk beds in dormitories before, but this was my first time seeing a bunk bed in a private room. The room did not have any toilets, so we had to use shared toilets.
Unusually, the hostel was equipped with a pool. It also had a washing machine with dryers - this was one of the reasons we chose this hostel, because we were traveling light and hadn’t packed too many clothes. The machine and dryer cost 10 ringgits (200 rupees) per use, and we only used it once. The hostel provided complimentary breakfast, which included coffee. Outside of breakfast hours, there was also a paid coffee machine.
During our stay, we visited a gurdwara - a place of worship for Sikhs - which was within walking distance from our hostel. The name of the gurdwara was Gurdwara Sahib Mainduab. However, it wasn’t as lively as I had thought. The gurdwara was locked from the inside, and we had to knock on the gate and call for someone to open it. A man opened the gate and invited us in.
The gurdwara was small, and there was only one other visitor - a man worshipping upstairs. We went upstairs briefly, then settled down on the first floor.
We had some conversations with the person downstairs who kindly made chai for us. They mentioned that the langar (community meal) is organized on every Friday, which was unlike the gurdwaras I have been to where the langar is served every day. We were there for an hour before we left.
We also went to Adyar Ananda Bhavan (a restaurant chain) near our hostel to try the chain in Malaysia. The chain is famous in Southern India and also known by its short name A2B. We ordered

Dosa served at Adyar Ananda Bhavan. Photo by Ravi Dwivedi. Released under the CC-BY-SA 4.0.
All this came down to around 33 ringgits (including taxes), i.e. around 660 rupees. We also purchased some snacks such as murukku from there for our trip.
We had planned a day trip to Malacca, but had to cancel it due to rain. We didn’t do a lot in Kuala Lumpur, and it ended up acting as a transit point for us to other destinations: flights from Kuala Lumpur were cheaper than Singapore, and in one case a flight via Kuala Lumpur was even cheaper than a direct flight!
We paid 15,000 rupees in total for the following three flights:
These were all AirAsia flights. The cheap tickets, however, did not include any checked-in luggage, and the cabin luggage weight limit was 7 kg. We also bought quite some stuff in Kuala Lumpur and Singapore, leading to an increase in the weight of our luggage.
We estimated that it would be cheaper for us to take only essential items such as clothes, cameras, and laptops, and to leave behind souvenirs and other non-essentials in lockers at the TBS bus stand in Kuala Lumpur, than to pay more for check-in luggage. It would take 140 ringgits for us to add a checked-in bag from Kuala Lumpur to Bandar Seri Begawan and back, while the cost for lockers was 55 ringgits at the rate of 5 ringgits every six hours.
We had seen these lockers when we alighted at the bus stand while coming from Johor Bahru. There might have been lockers in the airport itself as well, which would have been more convenient as we were planning to fly back in soon, but we weren’t sure about finding lockers at the airport and we didn’t want to waste time looking.
We had an early morning flight for Brunei on the 10th of December. We checked out from our hostel on the night of the 9th of December, and left for TBS to take a bus to the airport. We took a metro from the nearest metro station to TBS. Upon reaching there, we put our luggage in the lockers. The lockers were automated and there was no staff there to guide us.

Lockers at TBS bus station. Photo by Ravi Dwivedi. Released under the CC-BY-SA 4.0.
We bought a ticket for the airport bus from a counter at TBS for 26 ringgits for both of us. In order to give us tickets, the person at the counter asked for our passports, and we handed it over to them promptly. Since paying in cash did not provide any extra anonymity, I would advise others to book these buses online.
In Malaysia, you also need a boarding pass for buses. The bus terminal had kiosks for getting these printed, but they were broken and we had to go to a counter to obtain them. The boarding pass mentioned our gate number and other details such as our names and departure time of the bus. The company was Jet Bus.

My boarding pass for the bus to the airport in Kuala Lumpur. Photo by Ravi Dwivedi. Released under the CC-BY-SA 4.0.
To go to our boarding gate, we had to scan our boarding pass to let the AFC gates open. Then we went downstairs, leading into the waiting area. It had departure boards listing the bus timings and their respective gates. We boarded our bus around 10 minutes before the departure time - 00:00 hours. It departed at its scheduled time and took 45 minutes to reach KL Airport Terminal 2, where we alighted.
We reached 6 hours before our flight’s departure time of 06:30. We stopped at a convenience store at the airport to have some snacks. Then we weighed our bags at a weighing machine to check whether we were within the weight limit. It turned out that we were.
We went to an AirAsia counter to get our boarding passes. The lady at our counter checked our Brunei visas carefully and looked for any Brunei stamps on the passports to verify whether we had used that visa in the past. However, she didn’t weigh our bags to check whether they were within the limit, and gave us our boarding passes.
We had more than 4 hours to go before our flight. This was the downside of booking an early morning flight - we weren’t able to get a full night’s sleep.
A couple of hours before our flight time, we were hanging around our boarding gate. The place was crowded, so there were no seats available. There were no charging points. There was a Burger King outlet there which had some seating space and charging points. As we were hungry, we ordered two cups of cappuccino coffee (15.9 ringgits) and one large french fries (8.9 ringgits) from Burger King. The total amount was 24 ringgits.
When it was time to board the flight, we went to the waiting area for our boarding gates. Soon, we boarded the plane. It took 2.5 hours to reach the Brunei International Airport in the capital city of Bandar Seri Begawan.

View of Kuala Lumpur from the aeroplane. Photo by Ravi Dwivedi. Released under the CC-BY-SA 4.0.
Stay tuned for our experiences in Brunei!
Credits: Thanks to Badri, Benson and Contrapunctus for reviewing the draft.
Heyo,
In production Kubernetes environments, access control becomes critical when multiple services share the same cluster. I recently faced this exact scenario: a GKE cluster hosting multiple services across different namespaces, where a new team needed access to maintain and debug their service-but only their service.
The requirement was straightforward yet specific: grant external users the ability to exec into pods, view logs, and forward ports, but restrict this access to a single namespace within a single GKE cluster. No access to other clusters in the Google Cloud project, and no access to other namespaces.
Achieving this granular access control requires combining Google Cloud IAM with Kubernetes RBAC (Role-Based Access Control). Here’s how to implement it:
First, apply a unique tag to your GKE cluster. This tag will serve as the identifier for IAM policies.
Add an IAM policy binding that grants users access to resources with your specific tag. The Kubernetes Engine Viewer role (roles/container.viewer) provides sufficient base permissions without granting excessive access.
Define a ClusterRole that specifies the exact permissions needed:
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: custom-access-role
rules:
- apiGroups: [""]
resources: ["pods", "pods/exec", "pods/attach", "pods/portforward", "pods/log"]
verbs: ["get", "list", "watch", "create"]
Note: While you could use a namespace-scoped Role, a ClusterRole offers better reusability if you need similar permissions for other namespaces later.
Create a RoleBinding to connect the role to specific users and namespaces:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: custom-rolebinding
namespace: my-namespace
subjects:
- kind: User
name: myuser@gmail.com
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: custom-access-role
apiGroup: rbac.authorization.k8s.io
Apply both configurations using kubectl apply -f <filename>.
This approach creates a two-layer security model:
The result is a secure, maintainable solution that grants teams the access they need without compromising the security of other services in your cluster.
MiniDebConf Navi Mumbai 2025 which was MiniDebConf Mumbai, which in turn was FOSSMumbai x MiniDebian Conference, happened on 13th and 14th December, 2025, with a hotel as Day 1 venue and a college on Day 2.
Originally planned for the 8th of November, it got postponed to December due to operational reasons. Most of the on-ground logistics and other heavy lifting was done by Arya, Vidhya, MumbaiFOSS, and the Remigies Technologies team, so we didn’t had to worry much.
This time, I gave a talk on Basics of a Free Software Mirror (and how Debian does it) (Presentation URL). I had the idea for this talk for a while and gave a KDE version of it during KDE India Conf 2025. The gist was to explain how Free Software is delivered to users and how one can help. For MDC, I focused a bit on Debian mirror network(s) and who else host mirrors in India and trends.

At the onset someone mentioned my Termux mirror. Termux is a good project to get into mirror hosting with. I got into mirroring with it. It has low traffic (usually less than 20 GB/day) demands with a high request count and can be done on an existing 6 USD Digital Ocean nodes. Q&A time turned out more interesting than I anticipated. Folks touched upon commercial CDNs instead of community mirrors, supply chain security issues, and a bit of other stuff.
We had quite a number of interesting talks and I remember when Arya was telling me during CFP time, “bro we have too many talks now” :D.
Now, preparations have already started for MiniDebConf Kanpur 2026, scheduled for March 14th and 15th at the IIT campus. If you want to help, see the following thread. See you in the next one.


Goose is a local, extensible, open source AI agent that automates engineering tasks
I have recently packaged goose CLI for openSUSE tumbleweed & during the process, i had to patch the source code to disable the self update feature, as it is a standard practice in most of the Linux distributions to disable self-update commands for such programs to maintain system stability and security. This prevents users from inadvertently introducing incompatible changes or vulnerabilities that could arise from the untested upstream updates.
Now, for those who know, maintaining such a patch in the distribution packaging needs constant attention & adapting the patch to any upstream code changes, which is not ideal path forward. Hence, I have decided to bake the feature directly in the goose codebase. The change was relatively simple. I just added a cargo feature, which when invoked during the compile time, stops the update process with an error when a user invokes it. The advantage of this approach is that it eliminates the need of maintain a separate patch for the distribution package maintainers.
I have submitted the PR to the upstream & it was merged after a review from the maintainers. This is my first contribution to an open source rust project & i am looking forward to do contribute more impactful changes to goose!
Just like a ship needs an anchor to stabilize and hold it to port, humans too, I feel, have and require anchors to hold them in life. It could be an emotional anchor, a physical anchor, an anchor that stimulates your curiosity, a family member, a friend or a partner or a spiritual being.
An anchor holds you and helps you stabilize in stormy weather. An anchor can keep you going or stop you from going. An anchor orients you, helps you formulate your values and beliefs.
An anchor could be someone or something or oneself (thanks Saswata for the thought). Writing here is one of my anchors; what’s your anchor?
There’s this Bollywood movie by the name of Special 26, and I have been wishing all my friends turning 26 with this, hence the name Special 26. There isn’t anything particularly special about turning 26 though I’m realizing I’m closer to 30 than 20 now.
The happenings on my birthday and subsequent home visits have made me more grateful and happy for having friends and family who care. With age, I have started noticing small gestures and all the extra efforts they have been doing for me since forever, and this warms my heart now. Thank you, everyone. I’m grateful for having you in my life. :)
Learning-wise, DNS, RFCs, and discovering the history of my native place have been my go-to things recently. I went heavy into Domain Name System (DNS), which also translated to posting 1, 2, 3 and eventually taking the plunge of self-hosting name servers for sahilister.net and sahil.rocks.
There has been a shift from heavy grey to friendly white clothing for me. The year was also marked with not being with someone anymore; things change.
In 2025, somehow I was at the airport more times than at the railway station. Can say it was the year of jet-setting.
Being in another foreign land opened my mind to the thought of how to live one’s life in a more mindful manner, on which I’m still pondering months after the trip. As Yoda said - “Do. Or do not. There is no try”, I’m trying to slow down in life and do less (which is turning out harder) and be more in the moment, less distracted. Let’s revisit next year and see how this turned out.
Continuing from where Badri and I left off in the last post. On the 7th of December 2024, we boarded a bus from Singapore to the border town of Johor Bahru in Malaysia. The bus stopped at the Singapore emigration for us to get off for the formalities.
The process was similar to the immigration at the Singapore airport. It was automatic, and we just had to scan our passports for the gates to open. Here also, we didn’t get Singapore stamps on our passports.
After we were done with the emigration, we had to find our bus. We remembered the name of the bus company and the number plate, which helped us recognize our bus. It wasn’t there already after we came out of the emigration, but it arrived soon enough, and we boarded it promptly.
From the Singapore emigration, the bus travelled a few kilometers and dropped us at Johor Bahru Sentral (JB Sentral) bus station, where we had to go through Malaysian immigration. The process was manual, unlike Singapore, and there was an immigration officer at the counter who stamped our passports (which I like) and recorded our fingerprints.
At the bus terminal, we exchanged rupees at an exchange shop to get Malaysian ringgits. We could not find any free drinking water sources on the bus terminal, so we had to buy water.
Badri later told me that Johor Bahru has a lot of data centers, which need a lot of water for cooling. When he read about it later, he immediately connected it with the fact that there was no free drinking water, and we had to buy water. Such data centers can lead to scarcity of water for others in the area.
From JB Sentral, we took a bus to Larkin Terminal, as our hotel was nearby. It was 1.5 ringgits per person (30 rupees). In order to pay for the fare, we had to put cash in a box near the driver’s seat.
Around half-an-hour later, we reached our hotel. The time was 23:30 hours. The hotel room was hot as it didn’t have air-conditioning. The weather in Malaysia is on the hotter side throughout the year. It was a budget hotel, and we paid 70 ringgits for our room.
Badri slept soon after we checked-in. I went out during the midnight at around 00:30. I was hungry, so I entered a small scale restaurant nearby, which was quite lively for the midnight hours. At the restaurant, I ordered a coffee and an omelet. I also asked for drinking water. The unique thing about that was that they put ice in hot water to make its temperature normal.
My bill from the restaurant looked like the below-mentioned table, as the items’ names were in the local language Malay:
| Item | Price (Malaysian ringgits) | Conversion to Indian rupees | Comments |
|---|---|---|---|
| Nescafe Tarik | 2.50 | 50 | Coffee |
| Ais Kosong | 0.50 | 10 | Water |
| Telur Dadar | 2.00 | 40 | Omelet |
| SST Tax (6%) | 0.30 | 6 | |
| Total | 5.30 | 106 |
After checking out from the restaurant, I explored nearby shops. I also bought some water before going back to the hotel room.
The next day, we had a (pre-booked) bus to Kuala Lumpur. We checked out from the hotel 10 minutes after the check-out time (which was 14:00 hours). However, within those 10 minutes, the hotel staff already came up three times asking us to clear out (which we were doing as fast as possible). And finally on the third time they said our deposit was forfeit, even though it was supposed to be only for keys and towels.
The above-mentioned bus for Kuala Lumpur was from the nearby Larkin Bus Terminal. The bus terminal was right next to our hotel, so we walked till there.
Upon reaching there, we found out that the process of boarding a bus in Malaysia resembled with taking a flight. We needed to go to a counter to get our boarding passes, followed by reporting at our gate half-an-hour before the scheduled time. Furthermore, they had a separate waiting room and boarding gates. Also, there was a terminal listing buses with their arrival and departure signs. Finally, to top it off, the buses had seatbelts.
We got our boarding pass for 2 ringgits (40 rupees). After that, we proceeded to get something to eat as we were hungry. We went to a McDonald’s, but couldn’t order anything because of the long queue. We didn’t have a lot of time, so we proceeded towards our boarding gate without having anything.
The boarding gate was in a separate room, which had a vending machine. I tried to order something using my card, but the machine wasn’t working. In Malaysia, there is a custom of queueing up to board buses even before the bus has arrived. We saw it in Johor Bahru as well. The culture is so strong that they even did it in Singapore while waiting for the Johor Bahru bus!
Our bus departed at 15:30 as scheduled. The journey was around 5 hours. A couple of hours later, our bus stopped for a break. We got off the bus and went to the toilet. As we were starving (we didn’t have anything the whole day), we thought it was a good opportunity to get some snack. There was a stall selling some food. However, I had to determine which options were vegetarian. We finally settled on a cylindrical box of potato chips, labelled Mister Potato. They were 7 ringgits.
We didn’t know how long the bus is going to stop. Furthermore, eating inside buses in Malaysia is forbidden. When we went to get some coffee from the stall, our bus driver was standing there and made a face. We got an impression that he doesn’t want us to have coffee.
However, after we got into the bus, we had to wait for a long time for it to resume its journey as the driver was taking his sweet time to drink his coffee.
During the bus journey, we saw a lot of palm trees on the way. The landscape was beautiful, with good road infrastructure throughout the journey. Badri also helped me improve my blog post on obtaining Luxembourg visa in the bus.
The bus dropped us at the Terminal Bersepadu Selatan (TBS in short) in Kuala Lumpur at 21:30 hours.
Finally, we got something at the TBS. We also noticed that the TBS bus station had lockers. This gave us the idea of putting some of our luggage in the lockers later while we will be in Brunei. We had booked a cheap Air Asia ticket which doesn’t allow check-in luggage. Further, keeping the checked-in luggage in lockers for three days was cheaper than paying the excess luggage penalty for Air Asia.
We followed it up by taking a metro as our hotel was closer to a metro station. This was a bad day due to our deposit being forfeited unfairly, and got nothing to eat.
We took the metro to reach our hostel, which was located in the Bukit Bintang area. The name of this hostel was Manor by Mingle. I had stayed here earlier in February 2024 for two nights. Back then, I paid 1000 rupees per day for a dormitory bed. However, this time the same hostel was much cheaper. We got a private room for 800 rupees per day, with breakfast included. Earlier it might have been pricier due to my stay falling on weekends or maybe February has more tourists in Kuala Lumpur.
That’s it for this post. Stay tuned for our adventures in Malaysia!
DebConf25 was held at IMT Atlantique Brest Campus in France from 14th to 19th July 2025. As usual, it was preceded by DebCamp from 7th to 13th July.
I was less motivated to write this time. So this year, more pictures, less text. Hopefully, (eventually) I may come back to fill this up.
During the conference, Subin had this crazy idea of shooting “Parody of a popular clip from the American-Malayalee television series ‘Akkarakazhchakal’ advertising Debian.” He explained the whole story in the BTS video. The results turned out great, TBF:
DC25 network usage graphs. Click to enlarge.
Flow diagrams. Click to enlarge.
Streaming bandwidth graph. Click to enlarge.
As for the next DebConf work, it has already started. It seems like it never ends. We close one and in one or two months start working on the next one. DebConf is going to Argentina this time and we have a nice little logo too now.
Overall, DebConf25 Brest was a nice conference. Many thanks to local team, PEB and everyone involved for everything. Let’s see about next year. Bye!
PS - Talks are available on Debian media server.
People keep saying email is decentralised, and on a technical level that's true. Even today, anyone can fire up an email server and start sending emails to anyone else out there.
In practice, though, I've seen those who run their own mailservers increasingly complaining about the difficulty of managing their server's "reputation", especially in the spam filters of Big Tech companies. A lower reputation means your email are more likely to end up in a spam box—which makes Big Email very happy, because it'll tempt you to sign up and pay for their services after all (you don't always pay in money, but you do always pay).
To keep themselves happy, Big Email has very opaque or often nonexistent rules about how to get your email server off the blacklist if it ever falls into one. I learnt this the hard way when Snipette's servers got blacklisted due to a silly own-goal we did.
You see, even though we had our own mailbox, most of us were too comfortable with Gmail's familiar web interface to think of anything else. So we ended up using it the dumb way, which was to forward all snipettemag.com emails to our gmail.com address. Like all public email addresses, we used to get a lot of spam emails (would that actual article submissions were that frequent!) which we'd throw disdainfully into our spam box...or rather, to Gmail's spam box. That's where the trouble began, because all the email we were receiving was being forwarded from snipettemag.com to Gmail, so what Gmail learnt was that "dog, these snipettemag.com people sure do send a lot of spam!"
This led into a Black Mirror-esque series of bounced emails and documentation stonewalls to get our IP address reputation back—or at least, it seemed like things might go that way. Fortunately, we happened to anyway be shifting to a different webhost at the time, which came with a different IP address That allowed us to start again with a clean state (at the expense of whichever poor folks our old IP address was next assigned to).
Rather than auto-forwarding Snipette emails to Gmail's inbox, the better solution would have been to link up Gmail so that it managed Snipette's inbox directly (yes, adding an external IMAP server is a thing in Gmail, as is setting up an external SMTP server which we'd already done to be able to send emails from snipettemag.com rather than gmail.com).
Fortunately, we managed to go to the even better solution, which was to abandon Gmail entirely in favour of NextCloud Mail, whose interface had become good enough to use by then. (Local email clients like Thunderbird are also an option if you have a device of your own and don't have to keep borrowing your parents').
While things turned out well for Snipette, the lesson here is that if you care about delivering emails to Big Email users, mistakes can be costly. Worse, this helps spread the impression that email is "highly complex" or "difficult to set up" which would discourage new people from trying it at all. I don't know if this is just an impression that spread or something that has been deliberately perpetuated (maybe a bit of both?). It may be true of a very large-scale or specific email setups, but I've been hosting email myself on one domain or another since I was 12, with the process usually being so guided that setting it up was more like an automatic afterthought than a conscious decision.
This can have an impact even at the national level. I remember my friends studying at Rishi Valley, a small alternative school operating in rural Andhra Pradesh, emailing me using the local Rishi Valley operated email server. Today, by contrast, even IIT Madras opts to use Big Email for its newer programmes. (IIT Madras still operates its own email servers for its main domain, as do the IITs of Kharagpur, Bombay, Kanpur, and Delhi. Concerningly, every other IIT, despite being among the ranks of the country's top technical institutions, relies on Google or in some cases Microsoft instead of running their own email server.) Meanwhile, the government, in trying for digital souvereignty, has instead taken a leap backwards by shifting away from selfhosting to a Big Tech firm, albeit a local one.
Email isn't hard, but battling Big Email's spam filters can be frustrating and exhausting. Taking advantage of this are many "email delivery services" that have sprung up, offering you an API to deliver your emails for you in exchange for a subscription. They say they have the infrastructure to make sure your emails are delivered, but the more important ingredient is the organisational and legal clout and scale to make sure Big Email allows them in.
All this is much more work than it should be. And that's why, every so often, one selfhoster or another pops up saying they're giving up and going to switch to a bigger provider instead. This doesn't necessarily have to be Big Email—there are many not-so-big email providers to choose from as well—but it does defeat the goal of everyone being able to (theoretically) spin up their own email server.
A common problem faced by selfhosters is being in the stage where emails from your server aren't all summarily marked as spam, but the first email you send to any new Big Tech contact is marked so, nipping in the bud what could otherwise have been an engaging or fruitful conversation.
At Snipette, we do the hack of sending our first email to a new contact through one such delivery provider, Mailgun, with whom we already have a subscription for bulk delivery of our newsletter (a whole different story in itself). When they reply, we continue the conversation through our own mail server, because their spam filters would have figured out by then that ours is a desirable email.
Of course, this is only necessary for those providers which actually treat our emails in such a way. For us, it's mainly Google. Since a lot of places which use their own domains are still hosted on Google (looking at you, new IITs) a quick way to check this is to look up the MX record and see if it points to Google's domains.
$ dig -t mx iitm.ac.in
; <<>> DiG 9.18.33-1~deb12u2-Debian <<>> -t mx iitm.ac.in
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58599
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;iitm.ac.in. IN MX
;; ANSWER SECTION:
iitm.ac.in. 43200 IN MX 20 mailx2.iitm.ac.in.
iitm.ac.in. 43200 IN MX 10 mailx1.iitm.ac.in.
iitm.ac.in. 43200 IN MX 40 mailx4.iitm.ac.in.
iitm.ac.in. 43200 IN MX 30 mailx3.iitm.ac.in.
;; Query time: 216 msecThese records aren't showing up any Google related domains like aspmx.l.google.com to me, so if I'm writing to anyone on an iitm.ac.in domain I don't have to go through the whole first-contact rigmarole (some of the subdomains are, sadly, a different story).
If you don't have a handy Big Tech email API lying around as a backup, you might begin to think: what's the point? Taking a step back, why selfhost at all if all your emails are going to end up at Big Tech inboxes anyway?
But here's the thing: if there's so many of us selfhosters having the same dilemma, perhaps we can at least email each other? I have no interest in setting up arbitrary barriers to people who want to contact me, and neither, presumably, do you.
So, to the selfhosters thinking of giving up and going to Big(ger) Email, I would say: do that if you must, but keep your small email around too.
It's the only way we can have the alternative email network—the truly open and decentralised one—up and ready.
It's also the place where we can figure out better, more inclusive ways of doing things. Spam is a serious problem, but it doesn't have to be Big Email who gets to decide how we handle it. As long as you have at least one other Small Email person to communicate with, your selfhosted server is serving an important purpose.
And if you don't have anyone at all to exchange Small Email with? I'm willing to be that first person.
This conversation is from a discussion that took place on the FSCI groupchat. I decided to share it here since it might be useful for others as well. Your responses are slightly edited, but mine are copied more or less as-is.
I've spent so much money on renting a static IP address and buying machines to run Linux, BSD and other OSes to host open source stuff. But it's starting to get very expensive. Is it really worth it?
Maybe I should just focus on using AI so I can land a good job and then contribute to Free Software later...
Sounds fair about using proprietary software; not everyone has the luxury to use fully Free Software and even my brother has ended up having to use WhatsApp to maintain some social connections
But I just want to point out that using LLMs the way you're doing is also unlikely to make you successful and make you a good programmer
It could be a shortcut to getting semi-working prototypes, but think of it this way: if prompting is so easy, there's nothing stopping someone else from doing it rather than hiring you. What's going to set you apart is concrete skills like reading documentation and asking questions
If you really want to get in on the hype, the best place in my opinion is probably to learn more about the underlying mechanisms of LLMs and work on that: training, statistics, etc.
I see, thanks for the suggestions. I will try to improve my skills instead of wasting time on LLMs
I was learning about ML stuff to make models to achieve different tasks which is not a bubble like LLM: it has been used in the industry for a long time and hopefully it will be used even after the LLM bubble bursts
By the way, a couple of things I wanted to add are that there are ways to try out stuff even without spending a lot of money. I didn't have any access to online payment mechanisms when I started programming, so I used a free account on HelioHost and a patchwork of various other services where I could eke out an existence for my web projects. This helps me to call out bullshit even today when people say that I need to pay $5/mo for this or that service. There were some free things like domains on dot.tk that were available back then, which aren't around any more, but there must be new free things as well to work with. I would say not having money was a blessing in disguise, but it wasn't even really a disguise because I didn't feel any limitations.
The second is that community is important. The most obvious aspect of this is the ability to ask questions and conversely to help answer the questions of other people. I learnt this on the HelioHost forums and also on Q/A oriented places like Ask Ubuntu and other parts of the Stack Exchange network
One reason I dislike people asking LLMs for answers is that these answers (or the training for them) would have originally come from places like SE, but when people get an answer from an LLM there's no reciprocation—not even upvoting which would make a person happy to know their question is useful to many people and motivate them to engage more. Without engagement in those spaces, there's less motivation to ask new questions and write new answers, which is bad even from a hedonistic LLM-centred perspective as LLMs would end up relying on answers from an increasingly stale dataset
�
The main requirement for asking questions on those networks is a bit of patience while someone responds to your query. This wasn't an issue for me as my computer time was limited so I'd come back the next day to find an answer. In the longer run, you will also learn how better to frame questions even to the extent of narrowing down to the answer yourself (and still posting on SE, in case it helps someone else)
That was the obvious part of community, but the less often repeated part is to respect the resources you were given. I could have created multiple accounts on HelioHost to get around storage limits, but everyone doing this would lead to a breakdown of the entire system. Similarly, the first thing one used to learn about when getting into web crawling was to respect robots.txt directives. Big Tech companies have now violated this rule resulting in large swathes of the Web closing itself off behind memberships, registration-walls, and paywalls in an act of self-preservation
My advice here would be: take a bit of time to read and internalise the rules and norms of the community. Disobeying these rules and norms may be benificial to you in the short term (or even forever), but (a) it'll make people hate you, and (b) too much of it happening would disrupt the community itself. These norms are what make a community a community rather than a set of self-centred persons. And yes, "everyone who has a website on the Internet" is also a community of sorts
�
Finally, about programing itself: I think using LLM coding assistants are best likened to copy-pasting code snippets. They work to get a quick job done. Even I've done it (copy-pasting, I mean), including to build an ecommerce website using Perl, CGI, and minimal JavaScript. At the end of it, I had no idea I had used Perl and had only a minimal understanding of what CGI was, but it got the job done
😵
However, this was only a first step to understanding. It gave me the confidence that I could put something together and it'd work (maybe this is where LLMs differ as it's less of you putting things together and more of the machine attempting to do it). The next step is to go and read proper tutorials and documentation to get a good idea, from first principles, of how things work. My preferred method for this is O'Reilly books but I suppose there must be video resources and stuff to if that's what you prefer
Reading through the entire Django documentation for example gave me a good understanding of what the framework could do, so I could choose not just a way to do it but one of the optimum ways of doing it. It also helped me muddle my way through other frameworks like Laravel without reading the docs because I had a sense of "Django has an elegant way to do __, so there must be a similar way to do it in Laravel"
Since my computer time was restricted (as I mentioned before), having this full overview also allowed me to plan out code in my notebook and keeping it ready to type out. Indirectly, it would have accelerated my getting familiar with the code (I still plan things in my head quite often, though not necessarily in a notebook)
My strategy with code snippets right now is to type out the entire snippet again instead of copy-pasting: it's more time-consuming, but it helps me internalise and properly understand it. (When copying from my own code, I more often copy-paste because I already know how it works).
Code completion through static analysis and other methods is cool though; I only configured my emacs for it a few months ago and should look into fine-tuning it more 😇
Contrast this with someone I saw who made some code changes because "Claude told me to do it" but when the suggestions ended, they were totally lost about what the changes did and where to go next because they hadn't understood the code, only prompted an LLM to go through it
The conversation ended with an addendum from asd who encouraged me to post it to my blog:
The contradictions of capitalism is such that as long as claude is sending tokens and as long as you're willing to operate it, there'd be a capitalist who will want you to do it (and will pay your claude subscription fee) because he can sell your prompting labor for 10-50x what it costed him
...and they won't care if you know the craft of programming.
But they might care when they need somebody to fix the mess of a codebase that the LLM has produced?
Only if they can't get away with it.
Anyway in conclusion the above would help the reader become somebody I'd be able to think of hiring
Thanks for reading; please comment your thoughts and don't forget to like, share, and subscribe 🔔
Ctrl-C, Ctrl-V to your blog
But if I were to follow my principles I'd have to type it out again instead of copy-pasting ðŸ˜
You are no longer connected to this group chat. Click here to rejoin.
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.
make install-build-deps
Searched on Salsa and stumbled upon https://salsa.debian.org/cloud-team/debian-vagrant-images
Cloned the repo from salsa
$ git clone https://salsa.debian.org/cloud-team/debian-vagrant-images.gitInstall the build dependencies
$ make install-build-depsthis 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
$ git clone https://salsa.debian.org/debian/debian-vagrant-images.git
Cloning into 'debian-vagrant-images'...
remote: Enumerating objects: 5310, done.
remote: Counting objects: 100% (256/256), done.
remote: Compressing objects: 100% (96/96), done.
remote: Total 5310 (delta 141), reused 241 (delta 135), pack-reused 5054 (from 1)
Receiving objects: 100% (5310/5310), 629.81 KiB | 548.00 KiB/s, done.
Resolving deltas: 100% (2875/2875), done.
$ cd debian-vagrant-images/
$ git checkout 8975eb0 #the commit id of MR
Now let's see if we can build trixie now
$ 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
..... continuedAlthough 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.
Source code & documentation: https://codeberg.org/saikar/mcp-bugzilla
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.
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
Filesystem Size Used Avail Use% Mounted on
tmpfs 1.6G 344.0K 1.6G 0% /run
devtmpfs 7.7G 0 7.7G 0% /dev
/dev/sdb1 3.7G 3.7G 0 100% /cdrom
/dev/mapper/sda2_crypt 952.9G 5.8G 950.9G 0% /target
/dev/sda1 919.7M 260.0K 855.8M 0% /target/boot
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.
/mnt # btrfs subvolume create @home
Create 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.

Screenshot of Debian installer installing the base system.
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.
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
$ sudo apk add xrandr xinput inotify-tools iio-sensor-proxyEnable the service for iio-sensor-proxy
sudo rc-update add iio-sensor-proxyReboot the device.
Now in the device terminal start the sensor monitor-sensor
user@samsung-gt58 ~> monitor-sensor
Waiting for iio-sensor-proxy to appear
+++ iio-sensor-proxy appeared
=== Has accelerometer (orientation: normal, tilt: vertical)
=== Has ambient light sensor (value: 5.000000, unit: lux)
=== No proximity sensor
=== No compass
Light changed: 14.000000 (lux)
Accelerometer orientation changed: left-up
Tilt changed: tilted-down
Light changed: 12.000000 (lux)
Tilt changed: vertical
Light changed: 13.000000 (lux)
Light changed: 11.000000 (lux)
Light changed: 13.000000 (lux)
Accelerometer orientation changed: normal
Light changed: 5.000000 (lux)
Light changed: 6.000000 (lux)
Light changed: 5.000000 (lux)
Accelerometer orientation changed: right-up
Light changed: 3.000000 (lux)
Light changed: 4.000000 (lux)
Light changed: 5.000000 (lux)
Light changed: 12.000000 (lux)
Tilt changed: tilted-down
Light changed: 19.000000 (lux)
Accelerometer orientation changed: bottom-up
Tilt changed: vertical
Light changed: 1.000000 (lux)
Light changed: 2.000000 (lux)
Light changed: 4.000000 (lux)
Accelerometer orientation changed: right-up
Tilt changed: tilted-down
Light changed: 11.000000 (lux)
Accelerometer orientation changed: normal
Tilt changed: vertical
Tilt changed: tilted-down
Light changed: 18.000000 (lux)
Light changed: 21.000000 (lux)
Light changed: 22.000000 (lux)
Light changed: 19.000000 (lux)
Accelerometer orientation changed: left-up
Light changed: 17.000000 (lux)
Tilt changed: vertical
Light changed: 14.000000 (lux)
Tilt changed: tilted-down
Light changed: 16.000000 (lux)
Light changed: 18.000000 (lux)
Light changed: 17.000000 (lux)
Light changed: 18.000000 (lux)
Light changed: 17.000000 (lux)
Light changed: 18.000000 (lux)
Light changed: 17.000000 (lux)
Light changed: 18.000000 (lux)
Light changed: 17.000000 (lux)
As you can see we can read the rotation values from the sensor as I am rotating the tablet in different orientations.
Now we just need to use a script which changes the screen orientation using xrandr according to the sensor value.
#!/bin/sh
killall monitor-sensor
monitor-sensor > /dev/shm/sensor.log 2>&1 &
while inotifywait -e modify /dev/shm/sensor.log; do
ORIENTATION=$(tail /dev/shm/sensor.log | grep 'orientation' | tail -1 | grep -oE '[^ ]+$')
case "$ORIENTATION" in
normal)
xrandr -o normal
xinput set-prop "Goodix Capacitive TouchScreen" "Coordinate Transformation Matrix" 1 0 0 0 1 0 0 0 1
;;
left-up)
xrandr -o left
xinput set-prop "Goodix Capacitive TouchScreen" "Coordinate Transformation Matrix" 0 -1 1 1 0 0 0 0 1
;;
bottom-up)
xrandr -o inverted
xinput set-prop "Goodix Capacitive TouchScreen" "Coordinate Transformation Matrix" -1 0 1 0 -1 1 0 0 1
;;
right-up)
xrandr -o right
xinput set-prop "Goodix Capacitive TouchScreen" "Coordinate Transformation Matrix" 0 1 0 -1 0 1 0 0 1
;;
esac
doneauto-rotate-screen.sh
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.
user@samsung-gt58 ~> xinput --list
* Virtual core pointer id=2 [master pointer (3)]
* * Virtual core XTEST pointer id=4 [slave pointer (2)]
* * Zinitix Capacitive TouchScreen id=10 [slave pointer (2)]
* * Toad One Plus id=12 [slave pointer (2)]
* Virtual core keyboard id=3 [master keyboard (2)]
* Virtual core XTEST keyboard id=5 [slave keyboard (3)]
* GPIO Buttons id=6 [slave keyboard (3)]
* pm8941_pwrkey id=7 [slave keyboard (3)]
* pm8941_resin id=8 [slave keyboard (3)]
* Zinitix Capacitive TouchScreen id=11 [slave keyboard (3)]
* samsung-a2015 Headset Jack id=9 [slave keyboard (3)]
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.