F-Droid: A Repository or a Software Morgue?


Recently, the official F-Droid account called me a troll for describing their store as a "digital archaeology museum". As an ex-IT engineer and a Fedora user, I prefer to verify my "trolling" with actual data rather than just vibes.


I wrote a Python script to analyze their official index files (Main and Archive). The numbers are even worse than I expected.


The "Main" Repo Audit

This is the primary repository that users see by default. It is marketed as "modern".


Nearly 10% of the "active" repository hasn't been updated in over a decade. These are apps from the Android 5.0 Lollipop era. Keeping almost 400 abandoned projects in the primary store is a choice, and it's a poor one.


The Big Picture (Main + Archive)

When looking at the entire library of 8,161 apps:


Verdict

F-Droid is a fantastic historical archive of open-source software, but calling it a "modern app store" in 2026 is the real trolling. When over half of your "active" catalog is either stagnant or fossilized, you're not running a store—you're running a preserve for legacy code.


The Evidence

Run this on your own machine to see the numbers:


import requests
from datetime import datetime
from collections import Counter

REPOS = {
    "Main Repo": "https://f-droid.org/repo/index-v1.json",
    "Archive": "https://f-droid.org/archive/index-v1.json"
}

def get_stats(url):
    try:
        response = requests.get(url, timeout=30)
        response.raise_for_status()
        data = response.json()
        years = [
            datetime.fromtimestamp(app['lastUpdated'] / 1000.0).year 
            for app in data.get('apps', [])
        ]
        return Counter(years), len(years)
    except Exception as e:
        print(f"Download error: {e}")
        return None, 0

def print_analysis(name, stats, total):
    if not stats: return

    print(f"\n{'='*50}")
    print(f"ANALYSIS: {name} (Total Apps: {total})")
    print(f"{'='*50}")
    print(f"{'Year':<10} | {'Count':<10} | {'% of Total':<12}")
    print(f"{'-'*40}")

    active = 0
    stagnating = 0
    fossils = 0
    ancient = 0

    for year in sorted(stats.keys(), reverse=True):
        count = stats[year]
        percent = (count / total) * 100
        print(f"{year:<10} | {count:<10} | {percent:>10.1f}%")

        if year >= 2025:
            active += count
        elif year >= 2023:
            stagnating += count
        else:
            fossils += count
        
        if year <= 2015:
            ancient += count

    print(f"{'-'*40}")
    print(f"Active (2025-2026):     {active} ({ (active/total)*100:.1f}%)")
    print(f"Stagnating (2023-2024): {stagnating} ({ (stagnating/total)*100:.1f}%)")
    print(f"Fossils (<= 2022):      {fossils} ({ (fossils/total)*100:.1f}%)")
    print(f"Ancient (<= 2015):      {ancient} ({ (ancient/total)*100:.1f}%)")

def main():
    overall_stats = Counter()
    overall_total = 0

    for name, url in REPOS.items():
        print(f"Requesting {name}...")
        stats, total = get_stats(url)
        if stats:
            print_analysis(name, stats, total)
            overall_stats.update(stats)
            overall_total += total

    if overall_total > 0:
        print_analysis("OVERALL SUMMARY (Main + Archive)", overall_stats, overall_total)

if __name__ == "__main__":
    main()

Requirements


To run this analyzer on Fedora, you only need Python 3 and the 'requests' library.


Install it via DNF (recommended for Fedora):

sudo dnf install python3-requests


Or via pip:

pip install requests


Back to Android Section


Home



/android/