# 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".
* Total apps: 4108
* Active (updated in 2025-2026): 47.8%
* Stagnating (updated in 2023-2024): 16.2%
* Fossils (updated in 2022 or older): 36.1%
* Ancient (updated in 2015 or older): 9.3%

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:
* 42.5% of all apps are fossils (<= 2022)
* 14.1% are ancient (<= 2015), totaling 1,150 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:

```python
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

=> index.gmi Back to Android Section

=> / Home