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:
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
/android/