Android developer verification and what it means for application distribution

- Posted in Android by

Android’s developer verification system continues its rollout across the ecosystem. What started as a security proposal is now becoming a platform-level requirement that affects how applications are distributed on Android, including outside Google Play.

From F-Droid's perspective 1, 2, 3, this feels like a shift in how Android handles software distribution. It is moving towards a model where publishing software depends on centralised identity verification.


System-wide verification becoming platform enforcement

Developer verification is no longer limited to store accounts.

It is being applied at the platform level across certified Android devices, including applications installed outside Google Play.

That means installation is no longer just a matter of user choice or distribution method. It increasingly depends on whether the developer has been verified within a central system. Link

Even where sideloading still exists technically, distribution is more closely tied to identity approval than it used to be.


Independent distribution under pressure

Android has long supported different ways of installing apps, including third-party app stores and direct APK installation.

A lot of projects exist because that model allows software to be shared without central approval. Link

Developer verification changes part of that assumption.

If installing apps on certified devices depends on a verified developer identity, then alternative distribution stops being fully independent in practice. It becomes tied back to the same upstream system.

There is also a related point raised in F-Droid’s recent writing on trust: that trust in software systems does not come from blindly trusting organisations, but from transparent mechanisms such as open source code, reproducible builds, and verifiable infrastructure. That framing feels relevant here, because the more distribution depends on central identity verification, the more the balance shifts away from verifiable processes and towards institutional trust.


Structured developer tiers

There are also now different categories of developer accounts, including limited or hobbyist options.

These accounts come with restrictions on how widely apps can be distributed and how many devices they can reach.

It creates a clearer separation between types of developers:

  • fully verified developers with standard access
  • restricted accounts with limited distribution
  • unverified developers with reduced reach on certified devices

Google’s documentation describes these limited accounts as intended for students, hobbyists, and learners, with caps on distribution and reduced requirements.


Regulatory context: DMA and European institutions

The EU Digital Markets Act requires large platforms to allow effective third-party distribution and to avoid restrictions that undermine alternative app ecosystems.

The European Parliament has also asked formal questions about whether developer verification is compatible with these rules and whether it could affect sideloading or alternative distribution channels.

The European Commission has said it is monitoring how Android’s distribution model fits within these obligations, including sideloading and third-party app stores.

At the moment, there is no final regulatory decision specifically on developer verification. It is still being reviewed.


Privacy and structural considerations

Developer verification introduces a permanent link between software publishing and real-world identity.

That changes something that has been fairly central to open ecosystems: the ability to publish software without needing a central identity check.

Some of the structural effects seem fairly clear:

  • more centralised developer identity records
  • less room for pseudonymous publishing
  • stronger links between software and verified identities or organisations
  • increased visibility of distribution activity at platform level

What still remains technically true

Android still allows installation from outside app stores.

But technical ability is not the only thing that matters anymore when it comes to distribution.

Whether software can be installed is increasingly shaped by whether the developer is verified, rather than whether a user chooses to install it directly. Link


Implications for users

For most people, the changes are not immediately obvious. Apps still install through existing methods depending on device settings and region.

Over time though, it may become more noticeable:

  • more friction when installing apps from independent sources
  • some apps may not install if the developer is not verified
  • fewer small or independent apps available on certified devices
  • a clearer split between verified and unverified software

Official rollout structure

Stage Period Source
Early access begins November 2025 Google Android Developer documentation
Verification opens to all developers March 2026 Google Developer Console documentation
System service rollout begins (device-level verifier installed for later enforcement) June 2026 https://android-developers.googleblog.com/2026/06/android-developer-verification.html
Android system verifier service (com.google.android.verifier) introduced across certified devices June 2026 https://support.google.com/android/answer/17065026
Update confirming rollout progress and continued enforcement preparation June 18 2026 https://android-developers.googleblog.com/2026/06/android-developer-verification.html
Android Developer ID Status API and Developer Console API early access begins July 2026 https://developer.android.com/developer-verification
Limited distribution accounts introduced (students, hobbyists, learners, up to 20 devices) July 2026
Limited distribution accounts and Developer Console API launch globally August 2026
Advanced flow for installing apps from unverified developers introduced with security checkpoints August 2026
App registration required for participating stores in Brazil, Indonesia, Singapore and Thailand 30 September 2026
Enforcement phase begins in selected countries (Brazil, Indonesia, Singapore and Thailand) September 2026
Global expansion of verification requirement 2027 onwards

Android, Trust Layers, and What Installing an App Feels Like Now

- Posted in Android by

I’ve been working around Android long enough to remember when installing an APK from outside the Play Store didn’t feel like a “process.” It was just something you did.

You downloaded a file, enabled “unknown sources,” tapped install, and that was it. No real ceremony around it.

That simplicity is still technically there, but over time it has started to feel… layered. Not blocked, not removed, just surrounded by more steps that you notice more when you’re outside the default ecosystem.

And the strange part is that none of these changes arrived all at once. They accumulated quietly.

I still catch myself using the word sideloading, even though that wasn’t really what we called it in the early Android days. Back then it was just “installing from unknown sources,” which felt like a permission toggle rather than a category of activity.

The term sideloading itself came from broader computing and enterprise contexts and only later became the dominant way people describe installing apps outside official channels. Within Android discussions, it gradually replaced earlier terms like “unknown sources” or “non-Market installation.”

That shift in language is small, but it matches how the experience itself has changed.

The first thing I really noticed over time wasn’t that APK installation disappeared, it didn’t, but that the system started inserting more checkpoints around it.

Instead of a single switch, there are now per-app permissions. Instead of quiet installs, there are more warnings. Background installs are more restricted. Play Protect scans things more actively in the background.

On top of that, there are simply more hurdles in general now, more verification prompts, more “are you sure” flows, more conditions before an app is allowed to behave normally.

Individually, none of this is dramatic. But together, it changes the feeling of installing something outside the Play Store. It’s still possible, but it’s no longer frictionless.

And this is where an important point often gets missed in discussions about Android’s openness.

Sideloading still exists, yes. APKs still install. Developer options still allow it. Nothing has been fully removed.

But the practical experience has shifted from “a simple action” to “a managed process.”

You are no longer just installing an app. You are moving through a sequence of system decisions:

permissions, warnings, scans, identity checks, and background restrictions.

So even though the feature still exists, the friction profile around it has completely changed.

And that friction matters more than people sometimes admit.

One of the more subtle framing issues in this space is how Google often describes these users.

They tend to refer to them as “power users”.

The problem is that this label does not really match reality.

Most people installing APKs, using F-Droid, or avoiding the Play Store are not developers or technically advanced users. They are just regular end users who want different software choices, fewer adverts, more privacy, or more control over their devices.

Calling them “power users” creates the impression that they are a niche group doing something complex or exceptional. In practice, they are not. They are simply users whose needs fall outside the default ecosystem.

So the label is slightly misleading. Not because the users are doing anything advanced, but because the system has gradually made even basic alternative choices feel advanced.

Then there’s ecosystem-level friction where ad-heavy apps, tracking-heavy SDKs, and integrity-driven SDKs collectively shape what kind of apps feel usable without trade-offs like ads, tracking, or reduced functionality behind blockers.

On top of that, there are simply more verification prompts, more “are you sure” flows, more conditions before an app is allowed to behave normally.

This also extends into ecosystem-level friction where ad-heavy apps, tracking-heavy SDKs, and integrity-driven SDKs collectively shape what kind of apps feel usable without trade-offs like ads, tracking, or reduced functionality behind blockers.

And that friction matters more than people sometimes admit.

Then there’s developer verification, which feels like a different kind of shift altogether.

On paper, it’s straightforward. Developers distributing apps outside official channels may need to verify their identity. The reasoning is usually tied to reducing impersonation and making it harder for malicious apps to keep resurfacing.

I understand the logic behind it. From a platform perspective, it is a clean solution to a real problem.

But from the outside, especially if you’ve been part of smaller projects or open-source work, it changes what “publishing an app” feels like. It is no longer just building and sharing software. It becomes tied to identity in a way that wasn’t always part of the original model.

Even if nothing is blocked outright, the expectation shifts.

What surprised me more is how much of Android’s trust model now sits outside the app itself.

Play Integrity is a good example of this shift.

I’ve seen apps that don’t just check whether they are installed correctly, they evaluate the environment they are running in. If the device is rooted, running a custom ROM, or failing integrity checks, the app may refuse to run or may restrict features.

Banking and payment apps are the most common examples where this shows up.

Google justifies these restrictions on sideloading as measures for "fraud prevention" and "risk analysis", but it's unclear how much they actually reduce fraud or improve user safety in practice. From a developer perspective, this is usually framed as security and abuse prevention. From a user perspective, especially in everyday usage, it can also show up in more subtle ways, for example when a third-party keyboard is being used, or when accessibility services are active on the device. Even though some banking apps rely on accessibility features themselves, certain combinations of active services can still trigger restrictions. This often feels less like a strict security boundary and more like a broad compatibility filter.

So the question becomes less “is this app installed?” and more “is this environment acceptable?”

Another place where this shows up is through application protection systems such as PAIRIP (Protected Android Integrity Runtime Protection), which some developers use to make apps harder to modify, repackage, or analyse.

I understand why these systems exist. From a developer perspective, protecting an app from tampering, piracy, fraud, or reverse engineering is a reasonable goal. If you are distributing software to millions of devices, especially in areas like finance or payments, additional protections can feel like an obvious choice.

What I find interesting is how these protections are experienced from the other side.

For most users, PAIRIP is not something they actively interact with. They usually only notice it when something stops working. An app might refuse to launch on a custom ROM, behave unexpectedly on a rooted device, or fail in an environment that looks unusual to the protection system.

And because these checks often happen quietly in the background, it is not always obvious what went wrong. The app simply does not run, or reports a generic error, leaving users to guess whether the problem is security-related, compatibility-related, or something else entirely.

Developers end up feeling some of this friction too. Stronger protection can reduce certain risks, but it can also create support requests from legitimate users whose devices fail checks despite working perfectly well for everything else.

So once again, the question becomes less about whether an app can be installed and more about whether the environment it runs in is considered acceptable.

That is a subtle shift, but it feels consistent with a broader pattern across Android. More and more trust decisions are happening outside the software itself, through layers that evaluate devices, accounts, configurations, and runtime behaviour before an app is allowed to operate normally.

Then there’s the Google account layer, which is harder to point at directly because it is spread across services.

reCAPTCHA is part of that picture. It used to be a simple “prove you are human” step. Now it often behaves more like a risk-based system that reacts to behaviour, device history, and account context.

And in practice, many flows feel smoother when you are inside a long-standing Google account, and more restrictive when you are not.

It does not directly control APK installation, but it affects surrounding actions, sign-ins, downloads, API access, and verification flows when something looks unusual.

Another layer sits at the app level itself.

Many banking apps, food delivery apps, shopping apps, and media apps include analytics, advertising, and anti-fraud systems.

For example, some apps may collect signals such as device identifiers, installed app environment metadata, interaction patterns, or network context. This is typically used for fraud prevention, personalization, advertising measurement, or service optimization.

In practice, users often experience this indirectly, through recommendations, pricing experiments, or offers that seem shaped by past behaviour. It is difficult to draw a strict boundary between personalization, profiling, and advertising-driven optimization, because all of them rely on overlapping data signals.

There is also another layer that shows up through ad-supported ecosystems. Many apps include third-party ad SDKs, and in some cases ad content may lead to external websites or redirect flows. While platforms like the Play Store enforce policies against malicious behaviour, users may still occasionally encounter misleading ads or unsafe redirects depending on the ad network or implementation quality.

This is also where ad blockers or private DNS tools change the experience significantly, because they remove or reduce this entire advertising and tracking layer. That creates a very different version of the same apps, especially in free, ad-supported ecosystems.

In the middle of all this, I keep coming back to F-Droid.

F-Droid stands out because it isn’t just another app store with different policies, it reflects a different way of thinking about trust in software distribution. Instead of centering trust around developer identity, device attestation, or platform-controlled enforcement systems, it leans heavily on transparency, reproducible builds where possible, and open community review.

That difference matters in practice. It changes what is being verified and who gets to decide what “trusted” means. In mainstream ecosystems, trust is often tied to identities, accounts, and centralized enforcement rules. In F-Droid’s model, trust is primarily derived from the ability to inspect, build, and verify the source itself.

This also creates a clearer separation between software and identity infrastructure. Developers can publish without being embedded into a centralized verification pipeline, and users can install software without their device state or account status being part of the gatekeeping process.

F-Droid isn’t trying to replicate commercial app stores feature by feature. It operates on a different assumption entirely, that trust should come from openness and verifiability rather than layered identity checks and enforcement systems.

What I’ve ended up noticing is that Android hasn’t stopped being open. That would be too simple.

Instead, it has become a system where openness still exists, but it is surrounded by more conditions than it used to be.

Developer identity is one layer. Device integrity is another. Account systems and verification flows like reCAPTCHA sit around the edges. App-level analytics, ads, and protection systems such as Play Integrity and PAIRIP add further layers. And beyond that, there are simply more friction points across installation and runtime than before.

From a critical perspective, a recurring concern among users and developers is that many of these additional layers, such as identity verification, device integrity checks, account-linked risk scoring, and app-level analytics, do not only address security threats in isolation. Instead, they also concentrate control points within a smaller set of platform and infrastructure providers. For some users, especially those outside mainstream device configurations, this can feel less like neutral security enforcement and more like a system where usability increasingly depends on compliance with layered platform-defined trust signals.

Do all of these exist without reason? Do they address real problems, malware, fraud, impersonation, and abuse?

Moreover, when you use the system as a developer or as a user outside the default ecosystem, installation is no longer a single decision. It becomes a sequence of checks across different layers.

Installing an app is still possible.

It just does not feel like one step anymore.

And depending on how you use your device, that shift can feel like either added protection or a growing stack of systems you do not directly control.

Either way, it is not quite the same Android it used to be.

[Guide] Forgejo Repository Migration (Existing Databases)

- Posted in Guides by

Forgejo Repository Migration (Existing Databases)

Objective: Merge repositories into a Forgejo instance without overwriting the existing database.

  1. Stop Forgejo on Source sudo systemctl stop forgejo

  2. Archive Repositories tar czf forgejo-repositories.tar.gz /var/lib/forgejo/data/forgejo-repositories

  3. Transfer to New Server scp forgejo-repositories.tar.gz user@new-server:/root/

  4. Extract Safely mkdir -p /root/forgejo-import tar xzf forgejo-repositories.tar.gz -C /root/forgejo-import

  5. Merge into Forgejo Storage rsync -a /root/forgejo-import/var/lib/forgejo/data/forgejo-repositories/ \ /var/lib/forgejo/data/forgejo-repositories/ sudo chown -R git:git /var/lib/forgejo/data/forgejo-repositories

  6. Restart Forgejo sudo systemctl start forgejo

  7. Adopt Unregistered Repositories

Admin → Site Administration → Repositories → Unadopted Repositories
Scan and adopt repositories
Assign owners and confirm

Verifiy

Repositories appear in UI
Branches and commits are intact
Git clone works
Existing repos are unaffected

Note: Only repositories are migrated; database remains intact.

[Blog] Migrating Forgejo Repositories into an existing instance

- Posted in First Timers by

Migrating Forgejo Repositories into an existing instance (without overwriting the database)

This is a Forgejo migration scenario where multiple approaches were attempted, including official documentation, community guides, and requesting help on Mastodon.

In the end, the working solution was a repository-level migration combined with Forgejo’s “Adopt Repositories” feature, without touching or overwriting the existing database.


The goal was to merge repositories from an old Forgejo server into a new one.

However, the situation was more complex than anticipated:

  • Both servers already had active Forgejo installations
  • The new server already contained repositories and users
  • The database on the new server could not be overwritten
  • The old server was only accessible via filesystem (URL was demised in error)

I tried taking this into account: Migrate your Forgejo site - community blog, and going through the forgejo upgrades & cheat-sheets.

While helpful for full-instance migrations, these guides assume:

  • A complete database export is available
  • The target system is being fully replaced
  • There are no existing repositories on the destination instance

This did not match the constraints I was facing.


Moreover, restoring an existing SQLite database dump to another running instance has its own problems:

  • The new server already has an active database
  • Overwriting the database would cause data loss
  • Merging two Forgejo databases is not safely supported

I then tried Various Git-based backup options:

  • git clone --mirror
  • git bundle
  • direct filesystem copying

While these successfully preserved Git history, they did not solve the core issue:

Forgejo does not automatically register repositories that exist on disk.

As a result, repositories did not appear in the web interface after transfer.


While I tried to find help on Mastodon (directly from Forgejo team) and on XMPP, the responses I received either:

  • Referred back to full database migration guides
  • Suggested rebuilding repositories manually
  • Did not account for the “existing instance + filesystem-only source” scenario

I was honestly stuck.


I finally found this approach:

  • Filesystem-level repository transfer
  • Forgejo’s built-in repository adoption feature
  • Preservation of the existing database on the new server

This allowed both systems to be merged safely.


Stop Forgejo on the source server

To ensure consistency, Forgejo was stopped before copying repositories:

```bash id="s1" sudo systemctl stop forgejo


--- Backup repositories from the source server Repositories are stored as bare Git repositories in: ```id="s2" /var/lib/forgejo/data/forgejo-repositories

They were archived using:

```bash id="s3" tar czf forgejo-repositories.tar.gz /var/lib/forgejo/data/forgejo-repositories


This preserves full Git history, branches, and tags. --- Transfer to the new server The archive was copied to the new server: ```bash id="s4" scp forgejo-repositories.tar.gz user@new-server:/root/

Extract into a staging directory (You can copy directly to the prod folder as well)

To avoid disrupting existing repositories on the new instance, the archive was extracted safely:

```bash id="s5" mkdir -p /root/forgejo-import tar xzf forgejo-repositories.tar.gz -C /root/forgejo-import


--- Merge repositories into Forgejo storage The repositories were then merged into the active Forgejo repository directory: ```bash id="s6" rsync -a /root/forgejo-import/var/lib/forgejo/data/forgejo-repositories/ \ /var/lib/forgejo/data/forgejo-repositories/

Correct ownership was applied (I applied to only the updated repo folders and files):

```bash id="s7" sudo chown -R git:git /var/lib/forgejo/data/forgejo-repositories


--- Restart Forgejo Forgejo was restarted: ```bash id="s8" sudo systemctl start forgejo

At this moment, the repositories existed on disk but were not yet visible in the web interface.

This is expected behaviour because Forgejo relies on its database for repository registration.


Using “Unadopted Repositories”

Forgejo provides a built-in mechanism for handling this situation.

In the web interface:

  1. Log in as an administrator
  2. Navigate to Site Administration
  3. Open Repositories
  4. Select Unadopted Repositories
  5. Click the scan icon (magnifying glass)

Forgejo scanned the repository directory and listed all repositories that existed on disk but were not yet registered in the database.


Adopting repositories

Each repository was then:

  • Selected individually
  • Assigned to a user or organisation
  • Adopted into Forgejo

For my instance, I had separate user wise repositories listed for me.

Once adopted, Forgejo automatically:

  • Created the required database entries
  • Linked repository metadata to the filesystem
  • Made the repositories visible in the UI

Verifying the details

  • All repositories appeared in the interface
  • Branches and commit histories were intact
  • Git cloning worked via HTTPS and SSH
  • Existing repositories on the new server remained unaffected

I have written a steps only blog too, since I am sure several people will face this or maybe facing it already.

[Guide] Increase max characters posting count limit for self-hosted Mastodon server

- Posted in Guides by

If you search for the max_characters keyword in the Mastodon Github repository, you will see that it all points to the value within the StatusLengthValidator and a variable called MAX_CHARS.

MAX_CHARACTERS_LOCAL  = 255

To modify it, first, ssh into your Mastodon server, and switch to the root shell:

sudo -s

Then, switch to the Mastodon user

sudo -u mastodon -i

or

sudo -i -u mastodon

Now, modify the validator file:

nano -w PATH/live/app/validators/status_length_validator.rb

At the very top of the file, you will see the MAX_CHARS variable, which was by default 500, you can modify it to another integer, for example 3000 to allow a maximum of 3000 characters within each post.

class StatusLengthValidator < ActiveModel::Validator
  MAX_CHARS = 3000
  URL_PLACEHOLDER_CHARS = 23
  URL_PLACEHOLDER = 'x' * 23

One can do this manually via vim/nano file manager as well:

nano -w PATH/live/app/validators/status_length_validator.rb

Instantly restore ownership back to the mastodon user:

sudo chown mastodon:mastodon PATH/live/app/validators/status_length_validator.rb

One can also alternatively run the nano file as a mastodon user instead:

sudo -u mastodon nano -w PATH/live/app/validators/status_length_validator.rb

Exit to root shell and restart the Mastodon processes, or simply reboot.

exit
systemctl restart mastodon*

[Guide] PuTTY Backup & Restore [Windows]

- Posted in Guides by

Export

cmd.exe, requires elevated prompt due to reg-edit:

Only sessions (produces file putty-sessions.reg on the Desktop):

regedit /e "%USERPROFILE%\Desktop\putty-sessions.reg" HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions

All settings except ssh keys (produces file putty.reg on the Desktop):

regedit /e "%USERPROFILE%\Desktop\putty.reg" HKEY_CURRENT_USER\Software\SimonTatham

Powershell

Only sessions (produces file putty-sessions.reg on the Desktop):

reg export HKCU\Software\SimonTatham\PuTTY\Sessions ([Environment]::GetFolderPath("Desktop") + "\putty-sessions.reg")

All settings except ssh keys (produces file putty.reg on the Desktop):

reg export HKCU\Software\SimonTatham ([Environment]::GetFolderPath("Desktop") + "\putty.reg")


Import

Double-click on the *.reg file and accept the import.

Alternative ways:

cmd.exe, requires elevated command prompt:

regedit /i putty-sessions.reg
regedit /i putty.reg

PowerShell

reg import putty-sessions.reg
reg import putty.reg

Note: do not replace SimonTatham with your username.

Note: These commands will not export the related SSH keys.


Via Registry Editor

Export

  • Launch Run, then type regedit in the open drop down window
  • Navigate to HKEY_CURRENT_USER\Software\SimonTatham
  • Right click on SimonTatham key (directory icon), select Export. Give the file a name (say) putty.reg and save it to your location for later use.
  • Close Registry Editor.

Note: The export (full) will also export the related SSH Host Keys.

Import

  • Check previous method(s)

PuTTY Portable Restore

[path_to_Your_portable_apps]PuTTYPortable\Data\settings\putty.reg

[Guide] USSD UPI

- Posted in Android by

TL;WW



I tried paying via USSD UPI today, and it worked. I had to use the UPI ID function, and did not go through with mobile number, but it worked.

All I did was *99# > 1 > 3 > UPI ID > Amount > Text/Ref > UPI PIN > Confirm

One can also do it in shorter steps, like in any USSD code: *99*1*3# > UPI ID > Amount > Text/Ref > UPI PIN > Confirm

Please mind that you need to have the USSD UPI function activated, else this does not work.

I have captured it step wise in the below image as well.



USSD UPI Steps



Update: I just cross checked to see what it shows up on my BHIM UPI, now this is weird. It is blank name and upi detail for the receiver. Very odd. Bug maybe?
Update 2: This seemed to be a temporary issue. Rest 4-5 payments I made, all showed correctly, without any issues.
BHIM Corrupted Entry
Though the SMS which I received, showed correct details. See image below
SMS Shows Correct details

Mastodon

Server down

- Posted in Linux/Unix by

In the morning I found out, my fbin.in server is down. When I checked, I cannot see the server in my list of products.

I have reached out to the support team, and awaiting for their Germany login time to reply.

Not even sure how this happened, as my other servers are running fine. Finding it very odd.

There is one more point which comes to mind: if I had a good ISP provider at home, and port openings, this would probably be with me, but home-server is not possible, unfortunately, at least for me. :(

Update: 28.01.2026 -> So basically, I had to get a new server from them to get all up and running. Seems, and I take full responsibility for this, I only placed a cancellation order, and never realized it, or forgot all about it. Though this has nothing to do with bus factor, as even in community (take Bento's docker issue for example), the ownership remains with 1 person, the owner.

Anyways, my instances are all up and running now, and hopefully, I will not face this situation again.

Server side secure banking in India?

- Posted in Android by

India specifically has a approach of client side encryption, which for banking/payments is not necessary at all. Nothing is stored client side on an app, or a browser, so why do you need client side security?

If I am rooted, using magisk, shizuku or whatever on my phone, why would it matter to you as a bank? If your server side encryption is ON, robust, working, and is there, then you have nothing to worry. You anyways prohibit snapshot, recent gets blurred; so, why the heck do you force us to use your senseless apps which should in the first place not be reading what I have installed, or which app is using which feature on my phone. This is privacy breach, no safe space for me, and you are violating my constitutional rights, all in one go.

All Indian banking and UPI apps force you to not have #accessibility turned on (even though they f'ing use it themselves); no #root; no #bootloader-unlocked (seriously, you are snooping to kernel level!!!); no #developer-mode on; no #debugging mode on; no 3rd party #keyboards (reason: they snoop, and foogle does not snoop? The first thing foogle keyboard does is share your typing data to its servers); only keyboards in /sys/priv & /sys/priv-apps are permitted. What nonsense... What are you trying to hide that debugging will reveal, or any of these will reveal? You have closed source your codes, you do everything behind paywall, and you stink!

#indianbankingapps; #hsbc; #bob; #sbi; #hdfc; #icici; #bhimupi & rest of #illiterate-developers

Ref: RBI_Circular (PDF)

Upgrade Forgejo

- Posted in Linux/Unix by

Forgejo is the best when it comes to hosting your own stuff over a git. Rest all for me have been dull, and I get the pain for setting up any sort of app/software.

Anyhow, what I love about the binaries is, forgejo for one is the simplest to setup. Here is how I do it:


systemctl stop forgejo.service && wget https://codeberg.org/forgejo/forgejo/releases/download/vX.X.X/forgejo-X.X.X-linux-amd64 && chmod +x forgejo-X.X.X-linux-amd64 && cp forgejo-X.X.X-linux-amd64 /usr/local/bin/forgejo && chmod 755 /usr/local/bin/forgejo && systemctl start forgejo.service && rm forgejo-X.X.X-linux-amd64 && systemctl status forgejo.service

Simply replace the X.X.X with the version you are installing. Example: 11.0.9 or 13.0.4 (latest ones).

So something like:

systemctl stop forgejo.service && wget https://codeberg.org/forgejo/forgejo/releases/download/v13.0.4/forgejo-13.0.4-linux-amd64 && chmod +x forgejo-13.0.4-linux-amd64 && cp forgejo-13.0.4-linux-amd64 /usr/local/bin/forgejo && chmod 755 /usr/local/bin/forgejo && systemctl start forgejo.service && rm forgejo-13.0.4-linux-amd64 && systemctl status forgejo.service

or for the LTS:

systemctl stop forgejo.service && wget https://codeberg.org/forgejo/forgejo/releases/download/v11.0.9/forgejo-11.0.9-linux-amd64 && chmod +x forgejo-11.0.9-linux-amd64 && cp forgejo-11.0.9-linux-amd64 /usr/local/bin/forgejo && chmod 755 /usr/local/bin/forgejo && systemctl start forgejo.service && rm forgejo-11.0.9-linux-amd64 && systemctl status forgejo.service

[Book Review] A Murder In Paris - Matthew Blake

- Posted in Amazing Books by

Usually, I do not write about books, as I love to read and speak about the same, rather than jot down my memories about it. However, I guess I can start and with an exceptional book, I saw very differently.

Written by Matthew Blake, this book has woven the words in a different parallel line altogether. It relates so much to my own thoughts, how I see my vague memories as, how I have drifted them in ways I never imagines I could do.

The book is not just about how one sees and thinks, but how one remembers and recollects and then recalls the same recollection. With each passing step, that memory changes.

Started in one era; lied and kept that way for decades, to manipulate your own reality; how survival strategies were defined during the war, why someone can destroy you (own love) for mere survival. Seems survival of the cruelest, Cruella De Vil... .

What really resonates is this paragraph from pages 282-283:

Every time we recall a memory, we change the original, and all we have is the latest edited version of the memory. Over time, the memory that has been edited tens, hundreds, even thousands of times, has no connection with the original event. It could be your first kiss, the dying words of a loved one, a life-changing accident -- your memory of it will be different from how it actually happened, just because you've remembered it so many times.

enter image description here

I enjoy novels and suspense which lead to a deep examination of human nature—especially the question of whether memories can ever truly be trusted, with or without the influence of dementia. I highly recommend this book to everyone. It is a masterpiece in itself.

Copy Move

- Posted in Linux/Unix by

To ensure . files get moved/copied in one go.

Run - shopt -s dotglob

Then example - mv /tmp/home/source/* /home/destination/

You can put - shopt -s dotglob in your ~/.bashrc if you want it to be the default

Then run - source ~/.bashrc for it to reload

This I got from: Ubuntu Answers

India & oss

- Posted in First Timers by

Recently I have seen a lot of hub-dub about India going "make in India", especially towards governmental suits. Now, I really would love to have that done for India. Given if India goes OSS, while propagating so much about OSS, would really be the right step. Instead what has happened is going to zoho. Now zoho may claim to be secure and stuff, but we all know one thing for sure, unless I know what the software is made of, to the last line of code, how can I really be going OSS, or for that sake safe?

Even though I do not know how to read the whole code, but if the code is open and available, it gives me a security and risk free of knowing the community is aware and will surely raise or has already raised what is there, and what not, inflight risks included.

What actually is happening, or rather what has already gone BAU: Zoho lands GOI contract for 7 years

Email accounts of 12 lakh Central government employees now run on Zoho’s platform

Community at large is aware of what Zoho did recently. The so called "ulaa browser" is simply a closed sourced duplicate of Chromium + whatever they are hiding behind the wall. They landed lakhs of rupees in this doing, which was the start of blinding the already foolish bureaucrats.

Politics is all about money, power and the 4 legs of a chair. This contract is nothing but one and all of those pointers. There is nothing unique abut Zoho. There is nothing right about their so called whatsapp replacement, arratai.

Zoho reminds me of how bollywood is the best in copy-pasting. How Netflix readily copies from some original French or German movie/series and whips up a Spanish series. I will not deny, copy-pasting and trying to hide it is a big art, and artists like this are abundant, but eyes open one day, for everyone. Trouble is, it is already too late by then.

Wake up India. Rather while you are already awake, please stop wasting tax payers money, and do not use closed source software and compromising public data with closed sourced conglomerates as well.

We did not allow it. We did not bring you to power for doing what is not right. Remember, public has the biggest power. Pen really is mightier than 4 legs of your chair.

Meanwhile, GOI nonsense which raked my brain was:

Union Ministry of Education said that the Zoho Office Suite was already incorporated in the NIC mail system and “by embracing Zoho’s indigenous office productivity tools, we take a bold step in the Swadeshi movement, empowering India to lead with home-grown innovation, strengthen digital sovereignty, and secure our data for a self-reliant future.”

& furthermore, what is this supposed to mean?

A senior official said Zoho’s suite has also been activated to ensure that government employees do not use open source applications to create word files, spreadsheets and presentations.

Though the suite was available earlier, not many government employees were using it. “It was found that many government employees were using open source tools, which could compromise security of files, and it was decided to make them aware and display its features prominently on the internal mail platform,” said the official.

Are you even aware what you are saying? Simply put, "Seriously!!!"

So you mean millions of developers and trillions of users of OSS/FOSS/FLOSS are brainless? Everyone is getting compromised by using OSS/FOSS/FLOSS stuff?

This is one cake; MoE, are you even aware what you just did?

On October 3, the Union Ministry of Education issued an order nudging officials to use the Zoho suite “in alignment with the Government of India’s broader vision of transforming the nation from a service economy into a product nation, and in pursuit of building a self-reliant ecosystem in technology, hardware, and software solutions”.

This reminds me of how everyone thinks foogle is the "guru of search" (ref: The Vault Of Vishnu - Ashwin Sanghi, page 85, line 5 from top). Makes me laugh out loud.

I have reached out to The Hindu & The Zoho & will also reach out to MoE specifically to recant those words, and publicly apologies. They are already so deep into ego, they need to learn: they are the one in need of a real education and not the other way round here.

enter image description here

[Guide]Let's Encrypt SSL/HTTPS Certificate for a unique port with HestiaCP

- Posted in Guides by

Introduction

In this tutorial, I will guide you through the process of setting up a let's encrypt ssl/https certificate (reverse proxy) on a unique port other than 80/443, example port:4545 on the root server for hosting using Hestia Control Panel (See installation URL given under prerequisites below). Hestia Control Panel is a popular open source web server control panel that simplifies the management of your website, email accounts, databases, and other hosting-related tasks. This tutorial is compatible with both VPS and Root Server offerings by netcup.

Assumptions:

  • You already have a sub-domain setup and the requisite service installed at the specified http port (example - http://sd1.domain.tld:4545).
  • You have the sub-domain setup with SSL/HTTPS (443) setup (example - https://sd1.domain.tld)
  • You have bare minimum knowledge of terminal, web servers, vhosts, reverse proxy.

The reading time of this tutorial is about 35 minutes; implementation will take approximately 60-70 minutes.

Background

The objective of Let’s Encrypt and the ACME protocol is to make it possible to set up an HTTPS server and have it automatically obtain browser-trusted certificates without any human intervention. This is accomplished by running an ACME client on a web server. To know more, visit Let's Encrypt. This also forms a part for use in Nginx reverse proxy configuration.

Forgejo is a self-hosted lightweight software forge (simple software project management). Easy to install and low maintenance, it just does the job.

In the world of open-source software, the story of how a project is governed is often as important as the code itself. Forgejo is a powerful testament to this fact. It is a “soft fork” of Gitea, created by a community of users and contributors to ensure that the project’s future remains in the hands of a non-profit, community-driven organization.

Born out of concerns following the creation of a for-profit company to manage Gitea, Forgejo’s mission is to be a truly free and open-source software (FOSS) forge, managed under the stewardship of the Codeberg e.V. non-profit. It is technically very similar to Gitea, but philosophically, it represents a commitment to community ownership and non-commercial governance.

Since Forgejo by default/design runs on port 4545 and many other projects also default to port 4545, I chose a different port (example 4545 here). This helps me keep it running in the background without conflicting with other applications. This was necessary for 2 more reasons:

  • Clean url everytime Example instead having to type or visit https://git.example.com:4545 every time, I will have a cleaner url as https://git.example.com.
  • Issue an HTTPS/SSL/TLS enabled URL and enjoy the higher level of security. Visitors & users of my site would also know they are safe.

Prerequisites

  • A server from netcup with latest Ubuntu 20.04/22.04/LTS; Debian 10/11/12/LTS or later installed (see the below URL) - use minimal mode of installation, also called clean installation. Installation Tutorial or the blog guide here.
  • A registered domain name
  • Access to your server

Step 1: Update your system

Before we begin, it's essential to ensure that your system is up-to-date. Log in to your server via SSH as the root user and run the following command:

For Ubuntu/Debian:

apt update && apt upgrade -y

Step 2: Add the necessary changes to the service (example git)

username@serverip:port

I created a normal subdomain at normal 80/443 ports with LE SSL generated. Then in the git app.ini (/etc/git/app.in) file, added this under [server]

nano /etc/git/app.ini
--------------
[server]
ENABLE_ACME = enable
HTTPS_PORT = 4545 ssl
ROOT_URL = https://git.domain.tld
-------------- **(save changes to the file by typing CTRL+X simultaneously)**
CTRL+X
Y
Enter

Then under nginx.conf ($HESTIADATA\conf\web\git.domain.tld\nginx.conf) I added

nano /$HESTIADATA\conf\web\git.domain.tld\nginx.conf
--------------
 location / {
     client_max_body_size 4096M;
     proxy_pass http://localhost:4545;
     proxy_set_header Connection $http_connection;
     proxy_set_header Upgrade $http_upgrade;
     proxy_set_header Host $host;
     proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     proxy_set_header X-Forwarded-Proto $scheme;
-------------- **(save via)**
CTRL+X
Y
Enter

Then under apache2.conf ($HESTIADATA\conf\web\git.domain.tld\apach2.conf) I added

nano /$HESTIADATA\conf\web\git.domain.tld\apache2.conf
--------------
     ProxyPreserveHost On
     ProxyRequests off
     AllowEncodedSlashes NoDecode
     ProxyPass / http://localhost:4545/ nocanon
-------------- **(save via)**
CTRL+X
Y
Enter

Then under apache2.ssl.conf ($HESTIADATA\conf\web\git.domain.tld\apache2.ssl.conf) I added

nano /$HESTIADATA\conf\web\git.domain.tld\apach2.ssl.conf
--------------
 < VirtualHost git.domain.tld:8443 https >
*****************************
*****************************
    ProxyPreserveHost On
     ProxyRequests off
     AllowEncodedSlashes NoDecode
     ProxyPass / http://localhost:4545/ nocanon
-------------- **(save via)**
CTRL+X
Y
Enter

I also enabled the following to ensure the proxy works:

 a2enmod proxy
 a2enmod proxy_http
 a2enmod proxy_balancer
 a2enmod proxy_wstunnel
 systemctl restart apache2

Then I restarted all services

 systemctl restart apache2
 systemctl restart nginx
 systemctl start git.service

I got the help from these:

APache SSL long record rrror

Let's Encrypt SSL certificate

Gitea reverse proxy - Apache HTTPD

Gitea reverse proxy - general conf

Gitea reverse proxy - NGINX

Someone's personal Forgejo guide

Conclusion

Awesome! You've successfully set up a let's encrypt certificate on a unique port other than the usual 443/8443.

Sir? SIR!, Sire?

- Posted in Blabbermouth, me by

So just a bit of rant here. When you are in the corporate nonsense, a layer matters, I guess? People are so filled with ego, that they will ask someone what your level is. Example: Security, Bull, Bombay, or even Greece, does not matter, but if there is a swipe machine at the gate, I am sure it is not there as a museum piece, right? You need to swipe it, so swipe it for god's sake. What has someone's level in the company gotta do with it? I saw him/her entering without swiping. I requested, please swipe. The look was killing. Blurted: what "f level are you?"


🤣🤣🤣

So you see, why the SIRE comes into picture, MY LORD?


Point-Love-15

FOSS India Pune Meetup, 2025

- Posted in Club Frenzy by

I came back from Pune FOSS Meetup (monthly ones usually) today (my first ever). The monthly meetup was nice, interactive, and the room was filled (approx 40-45 of us were there) with youngsters beaming for new things, knowledge, and pretty shy as well. 🪭😳

Onkar, Sriya, Agastya, Prathamesh, Khushi (FOSSUnited) and Joshua (host/Technogise) were very supportive, open and made every one feel very welcomed. It was real nice to be there, got to know a lot.

What I really liked was that youngsters were filled with thoughts about what FOSS is all about? They were intently listening, even interacting, asking questions, and I saw few take notes. I am bad at remembering names (not faces though), so I am not sure I recall the names (anger management). Anyways, I heard one enthusiast take the name of Joplin, which peaked my height, as being India, and knowing how things go (to a certain extent of course), I liked it and started to pitch for the usage of F-Droid as well, which I was sad to see, hardly anyone knew.

Some knew of AuroraStore as well, and were using it daily. I was pitching more on take control and switch from closed source to open source. I spoke about some nightmares of my rooting experience of more than a decade & half back, which was like a WOAH for me too.

All working individuals were pitching Linux/Unix, which was so nice. I kept cringing about being a non-dev 😜, and liked how we had a good interactive session throughout.

What I found odd, and I have been vocal anyways: usage of google and proprietary stuff a lot by everyone. We need to move out of the GAFAM nonsense and take back our privacy, which I tried to pitch as much as possible. Drumming the R.E.M. Privacy is Scrooge McDuck saving his Lucky Coin from Cruella, Money from Maa Beagle & Beagle Boys.

Another thing I found odd, XMPP is missing from India & FOSS. Start using it too people. 🙂

FYI: I host a lot of stuffs, and own my domain and what not. Start using them, and happy to have that traffic.. --> LibreQR | 4G Search | LibreY Search | PasteBin | Hosts

To wrap this post up...

There were refreshments for everyone and the best part for me; they kept it vegetarian. 👌👌 Overall, I enjoyed being there, and I hope they liked my butting too. 😎🫡



Keeping this small so as not to bore anyone wishing to read this. Unfortunately, I will not be able to attend the Bangalore one. Guess, I can do it next year.

Termux & Remote SSH

- Posted in Android by

Install Termux & Termux Styling

Upgrade packages & install openssh and iproute2 on termux.Also, install root packages & busybox package if you need them.

pkg update -y && pkg upgrade -y
pkg install openssh -y
pkg install iproute2 -y
pkg install root-repo -y
pkg install busybox termux-services -y

If you like, you can also add the following termux repositories:

echo "deb https://grimler.se/termux-packages-24 stable main" > $PREFIX/etc/apt/sources.list
echo "deb https://grimler.se/termux-packages-24 stable main" > $PREFIX/etc/apt/sources.list.d/game.list
echo "deb https://grimler.se/termux-packages-24 stable main" > $PREFIX/etc/apt/sources.list.d/science.list

Ensure to setup the storage and stuff beforehand. See here: Setup Storage

Create SSH Private/Public Key Pair on Android - Termux

In our android device, we need to generate SSH key pair for connecting to SSH server the remote machine (example debian). So, run the following command (this will also name the file as android for easy referencing):

ssh-keygen -t ed25519 -f id_ed25519_android

This will create the public & private key files in the ~/.ssh folder (/data/data/com.termux/files/homes/.ssh)

Send SSH Public Key to Remote Machine

Run cat ~/.ssh/id_ed25519_android.pub from termux which will return the public key for your android device.

It will be something like this:

ssh-ed25519 ABCDE1AaaA1aAAA1AAA1AAAAAAAAAaaaA1AaaAaaaAaaa1aAAAAaaAAAAaAaaaAAaaAA user@host

Now copy and paste this key to your remote machine either via the chat box option in the file transfer assistant app PlainApp or copying the id_ed25519_android.pub file across to your remote machine and then copy the content to ~/.ssh/authorized_keys file ($HOME/.ssh/authorized_keys).

Now kill any running sshd service by typing in termux: pkill -9 sshd. This is to let go of any cache or broken service pipes.

Now rerun sshd and connect to your remote server using the private key as pairing for the public key, via:

ssh -i ~/.ssh/id_ed25519_android user@host -p 1234


Sources & my own racking of 5 days:

Termux Wiki | Termux Repos | Some Logic


Sample images:

  • Main Screen

Termux Main Window

  • SSH Connected

SSH Connected

  • Sample Commands

Commands being run

Rewrite Engine (Messy)

- Posted in Guides by

Anyways.. To redirect a website, say example.co.uk to say example.co.uk/file.php

RewriteEngine on RewriteCond %{HTTP_HOST} ^example\.co\.uk$
[OR] RewriteCond %{HTTP_HOST} ^www\.example\.co\.uk$
RewriteRule ^/?$ "https\:\/\/example\.co\.uk\/file.php"
[R=301,L]

To rewrite PHP files

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^.]+)/?$ $1.php [NC,L]
RewriteCond %{THE_REQUEST} /([^.]+)\.php [NC]
RewriteRule ^ /%1 [NC,L,R]
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [NC,L]

To rewrite HTML files

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^.]+)$ $1.html [NC,L]
RewriteEngine on
RewriteCond %{THE_REQUEST} /([^.]+)\.html [NC]
RewriteRule ^ /%1 [NC,L,R]
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^ %{REQUEST_URI}.html [NC,L]

To ensure access is limited and not exposed

<Files 403.shtml>
order allow,deny
allow from all
</Files>

RSS-Bridge - Installation

- Posted in Guides by

Even though they have their guides, it somehow never works for me (possible as I am using a master user)

I will just describe the steps here for traditional installation on either a shared hosting or on a control panel based hosting.

CD to the folder under html of the virtual host.

  • wget https://github.com/RSS-Bridge/rss-bridge/archive/refs/heads/master.zip
  • unzip master.zip
  • mv rss-bridge-master/.* .
  • rm rss-bridge-master && rm master.zip && cp config.default.ini.php config.ini.php
  • optionally you can delete the "docker" files/folders
  • make necessary changes where you wish. If on a shared server, do not enable all bridges
  • chown -R user:user ./* ./.* && chown -R user:www-data ./cache && cd

CHATTR - DNS Nameserver file (immutable)

- Posted in Linux/Unix by

Check if immutable attribute is currently applied or not:

lsattr /etc/resolv.conf

Result

----i---------e------- /etc/resolv.conf

Remove it:

sudo chattr -i /etc/resolv.conf

Verify:

lsattr /etc/resolv.conf

Result

--------------e------- /etc/resolv.conf

Make changes to the resolv file for DNS nameservers:

nano /etc/resolv.conf CTRL+X (save) > Y > ENTER

Apply the attribute again:

sudo chattr +i /etc/resolv.conf

Verify:

lsattr /etc/resolv.conf

Result

----i---------e------- /etc/resolv.conf

Ubuntu Forum