Code and data for arewedecentralizedyet.online and related projects
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add a version of the fedi data that looks software by software

+529 -320
+1 -1
centralization_stats.py
··· 84 84 85 85 # Different CSVs use different columns for the hostname 86 86 def get_domain(row): 87 - for key in ("domain", "hostname","instance","name","org_id","e.id","o.name","a.asn","asn", "provider", "verifier"): 87 + for key in ("domain", "hostname","instance","name","org_id","e.id","o.name","a.asn","asn", "provider", "verifier", "software"): 88 88 if key in row: 89 89 return row.get(key, "") 90 90 return None
+88
data-processing/fedi-software/fedi-software-mau.py
··· 1 + #!/usr/bin/env python3 2 + 3 + import csv 4 + import re 5 + from collections import defaultdict 6 + from datetime import datetime, timezone 7 + from pathlib import Path 8 + 9 + TIMESTAMP_RE = re.compile( 10 + r"(?P<ts>\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2})(?P<tz>Z|[+-]\d{2}:?\d{2})?" 11 + ) 12 + 13 + 14 + def parse_timestamp_from_name(name): 15 + match = TIMESTAMP_RE.search(name) 16 + if not match: 17 + return None 18 + ts = match.group("ts") 19 + tz = match.group("tz") or "" 20 + if tz == "Z": 21 + tz = "+00:00" 22 + iso = f"{ts}{tz}" 23 + try: 24 + dt = datetime.fromisoformat(iso) 25 + except ValueError: 26 + return None 27 + if dt.tzinfo is None: 28 + dt = dt.replace(tzinfo=timezone.utc) 29 + return dt 30 + 31 + 32 + def find_newest_file(directory): 33 + candidates = [] 34 + for path in Path(directory).iterdir(): 35 + if not path.is_file(): 36 + continue 37 + dt = parse_timestamp_from_name(path.name) 38 + if dt is None: 39 + continue 40 + candidates.append((dt, path)) 41 + if not candidates: 42 + raise RuntimeError(f"No timestamped files found in {directory}") 43 + candidates.sort(key=lambda item: item[0]) 44 + return candidates[-1][1] 45 + 46 + 47 + def load_mau_by_software(csv_path): 48 + totals = defaultdict(int) 49 + with open(csv_path, newline="") as handle: 50 + reader = csv.DictReader(handle) 51 + for row in reader: 52 + software = (row.get("software") or "").strip() 53 + if not software: 54 + continue 55 + mau_raw = (row.get("active_month") or "").strip() 56 + if not mau_raw: 57 + continue 58 + try: 59 + mau = int(mau_raw) 60 + except ValueError: 61 + continue 62 + totals[software] += mau 63 + return totals 64 + 65 + 66 + def main(): 67 + repo_root = Path(__file__).resolve().parents[2] 68 + input_dir = repo_root / "data" / "fedi-mau" 69 + output_dir = repo_root / "data" / "fedi-software" 70 + output_dir.mkdir(parents=True, exist_ok=True) 71 + 72 + newest_file = find_newest_file(input_dir) 73 + mau_totals = load_mau_by_software(newest_file) 74 + 75 + timestamp = datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ") 76 + output_path = output_dir / f"{timestamp}.csv" 77 + 78 + with output_path.open("w", newline="", encoding="utf-8") as handle: 79 + writer = csv.writer(handle) 80 + writer.writerow(["software", "mau"]) 81 + for software in sorted(mau_totals): 82 + writer.writerow([software, mau_totals[software]]) 83 + 84 + print(f"Wrote {output_path}") 85 + 86 + 87 + if __name__ == "__main__": 88 + main()
+30 -1
helpers/update-datafile.py
··· 178 178 data = load_data_js(DATA_JS_PATH) 179 179 180 180 fedi_csv = find_newest_file(REPO_ROOT / "data" / "fedi-mau") 181 + fedi_software_csv = find_newest_file(REPO_ROOT / "data" / "fedi-software") 181 182 at_csv = find_newest_file(REPO_ROOT / "data" / "at-mau") 182 183 git_csv = find_newest_file(REPO_ROOT / "data" / "git") 183 184 bsky_verifiers_csv = find_newest_file(REPO_ROOT / "data" / "bsky-verifiers") 184 185 185 186 fedi_dt = parse_timestamp_from_name(fedi_csv.name) 187 + fedi_software_dt = parse_timestamp_from_name(fedi_software_csv.name) 186 188 at_dt = parse_timestamp_from_name(at_csv.name) 187 189 git_dt = parse_timestamp_from_name(git_csv.name) 188 190 bsky_verifiers_dt = parse_timestamp_from_name(bsky_verifiers_csv.name) 189 - if fedi_dt is None or at_dt is None or git_dt is None or bsky_verifiers_dt is None: 191 + if ( 192 + fedi_dt is None 193 + or fedi_software_dt is None 194 + or at_dt is None 195 + or git_dt is None 196 + or bsky_verifiers_dt is None 197 + ): 190 198 raise RuntimeError("Unable to parse timestamps for latest files") 191 199 192 200 update_network( ··· 198 206 ) 199 207 update_network( 200 208 data, 209 + "fedi_software", 210 + fedi_software_csv, 211 + fedi_software_dt.strftime("%m-%d-%Y"), 212 + data_file=str(fedi_software_csv.relative_to(REPO_ROOT)), 213 + ) 214 + update_network( 215 + data, 201 216 "at", 202 217 at_csv, 203 218 at_dt.strftime("%m-%d-%Y"), ··· 226 241 "weekly", 227 242 fedi_csv, 228 243 find_closest_to(REPO_ROOT / "data" / "fedi-mau", week_target), 244 + ) 245 + update_period_trend( 246 + data, 247 + "fedi_software", 248 + "weekly", 249 + fedi_software_csv, 250 + find_closest_to(REPO_ROOT / "data" / "fedi-software", week_target), 229 251 ) 230 252 update_period_trend( 231 253 data, ··· 247 269 "monthly", 248 270 fedi_csv, 249 271 find_closest_to(REPO_ROOT / "data" / "fedi-mau", month_target), 272 + ) 273 + update_period_trend( 274 + data, 275 + "fedi_software", 276 + "monthly", 277 + fedi_software_csv, 278 + find_closest_to(REPO_ROOT / "data" / "fedi-software", month_target), 250 279 ) 251 280 update_period_trend( 252 281 data,
+410 -318
www/data.js
··· 1 1 var data = { 2 2 "fedi": { 3 - "lastUpdate": "01-19-2026", 4 - "dataFile": "data/fedi-mau/2026-01-19T07:01:01Z.csv", 5 - "HHI": 841, 6 - "shannon": 4.6757, 7 - "simpson": 0.9159, 8 - "servers": 28119, 9 - "biggest_abs": 297593, 10 - "biggest_pct": 26.2, 11 - "rest_abs": 838071, 12 - "rest_pct": 73.8, 3 + "lastUpdate": "01-24-2026", 4 + "dataFile": "data/fedi-mau/2026-01-24T05:54:41Z.csv", 5 + "HHI": 863, 6 + "shannon": 4.6557, 7 + "simpson": 0.9136, 8 + "servers": 28375, 9 + "biggest_abs": 307669, 10 + "biggest_pct": 26.59, 11 + "rest_abs": 849203, 12 + "rest_pct": 73.41, 13 13 "b_vals": [ 14 14 [ 15 15 25, ··· 25 25 ], 26 26 [ 27 27 90, 28 - 439 28 + 440 29 29 ], 30 30 [ 31 31 99, 32 - 16763 32 + 16807 33 33 ], 34 34 [ 35 35 99.5, 36 - 22441 36 + 22591 37 37 ] 38 38 ] 39 39 }, 40 40 "at": { 41 - "lastUpdate": "01-19-2026", 42 - "dataFile": "data/at-mau/2026-01-19T07:00:28Z.csv", 43 - "HHI": 9802, 44 - "shannon": 0.0766, 45 - "simpson": 0.0197, 46 - "servers": 1640, 47 - "biggest_abs": 5753464, 41 + "lastUpdate": "01-24-2026", 42 + "dataFile": "data/at-mau/2026-01-24T05:54:02Z.csv", 43 + "HHI": 9803, 44 + "shannon": 0.0764, 45 + "simpson": 0.0196, 46 + "servers": 1658, 47 + "biggest_abs": 5837593, 48 48 "biggest_pct": 99.01, 49 - "rest_abs": 57666, 49 + "rest_abs": 58202, 50 50 "rest_pct": 0.99, 51 51 "b_vals": [ 52 52 [ ··· 76 76 ] 77 77 }, 78 78 "git": { 79 - "lastUpdate": "01-19-2026", 80 - "HHI": 9367, 81 - "shannon": 0.1957, 82 - "simpson": 0.0633, 79 + "lastUpdate": "01-23-2026", 80 + "HHI": 9368, 81 + "shannon": 0.1954, 82 + "simpson": 0.0631, 83 83 "servers": 1578, 84 - "biggest_abs": 302489652, 84 + "biggest_abs": 303214156, 85 85 "biggest_pct": 96.77, 86 - "rest_abs": 10112135, 86 + "rest_abs": 10115096, 87 87 "rest_pct": 3.23, 88 88 "b_vals": [ 89 89 [ ··· 111 111 4 112 112 ] 113 113 ], 114 - "dataFile": "data/git/2026-01-19T00:00:00__sh-fromhtml.csv" 114 + "dataFile": "data/git/2026-01-23T22:53:35__sh-fromhtml.csv" 115 115 }, 116 116 "hosting": { 117 117 "lastUpdate": "10-31-2025", ··· 264 264 "trends": { 265 265 "fedi": { 266 266 "weekly": { 267 - "shannon": -0.0107, 267 + "shannon": -0.0264, 268 268 "shannon_contrib": { 269 269 "increase": [ 270 270 { 271 271 "host": "theforkiverse.com", 272 - "change": 0.013765, 273 - "user_change": 3682 272 + "change": 0.009682, 273 + "user_change": 2916 274 274 }, 275 275 { 276 - "host": "mstdn.z.org", 277 - "change": 0.01278, 278 - "user_change": 2348 276 + "host": "pixelfed.au", 277 + "change": 0.006282, 278 + "user_change": 1255 279 279 }, 280 280 { 281 281 "host": "pixelfed.social", 282 - "change": 0.00449, 283 - "user_change": 4898 282 + "change": 0.004089, 283 + "user_change": 5037 284 284 }, 285 285 { 286 - "host": "hawirkitabak.com", 287 - "change": 0.003304, 288 - "user_change": 496 286 + "host": "pixelfed.tokyo", 287 + "change": 0.001983, 288 + "user_change": 410 289 289 }, 290 290 { 291 - "host": "pixelfed.au", 292 - "change": 0.002132, 293 - "user_change": 398 291 + "host": "mastodon.social", 292 + "change": 0.001603, 293 + "user_change": 11881 294 294 }, 295 295 { 296 - "host": "pixelfed.tokyo", 297 - "change": 0.002105, 298 - "user_change": 402 296 + "host": "tingling.machinerunning.io", 297 + "change": 0.001597, 298 + "user_change": 215 299 299 }, 300 300 { 301 - "host": "shitposter.world", 302 - "change": 0.001318, 303 - "user_change": 170 301 + "host": "sociale.network", 302 + "change": 0.001537, 303 + "user_change": 206 304 304 }, 305 305 { 306 - "host": "write.rlp.schule", 307 - "change": 0.000824, 308 - "user_change": 141 306 + "host": "phijkchu.com", 307 + "change": 0.001345, 308 + "user_change": 602 309 309 }, 310 310 { 311 - "host": "urbanists.social", 312 - "change": 0.000705, 313 - "user_change": 128 311 + "host": "garr.tv", 312 + "change": 0.001133, 313 + "user_change": 162 314 314 }, 315 315 { 316 - "host": "pixelfed.de.", 317 - "change": 0.000693, 318 - "user_change": 274 316 + "host": "social.vivaldi.net", 317 + "change": 0.001124, 318 + "user_change": 477 319 319 } 320 320 ], 321 321 "decrease": [ 322 322 { 323 + "host": "troet.cafe", 324 + "change": -0.010821, 325 + "user_change": -2706 326 + }, 327 + { 323 328 "host": "gram.social", 324 - "change": -0.003856, 325 - "user_change": -1000 329 + "change": -0.008367, 330 + "user_change": -2405 326 331 }, 327 332 { 328 333 "host": "fed.brid.gy", 329 - "change": -0.001909, 330 - "user_change": 262 334 + "change": -0.002019, 335 + "user_change": 373 331 336 }, 332 337 { 333 - "host": "micro.blog", 334 - "change": -0.001887, 335 - "user_change": -388 338 + "host": "mostr.pub", 339 + "change": -0.0011, 340 + "user_change": 379 336 341 }, 337 342 { 338 - "host": "yourpix.au", 339 - "change": -0.001069, 340 - "user_change": -140 343 + "host": "fedibird.com", 344 + "change": -0.001058, 345 + "user_change": -138 341 346 }, 342 347 { 343 - "host": "lemmy.world", 344 - "change": -0.001049, 345 - "user_change": -81 348 + "host": "pix.netfreaks.fr", 349 + "change": -0.00098, 350 + "user_change": -148 346 351 }, 347 352 { 348 - "host": "sociale.network", 349 - "change": -0.001048, 350 - "user_change": -152 353 + "host": "thu.closed.social", 354 + "change": -0.00096, 355 + "user_change": -163 351 356 }, 352 357 { 353 - "host": "pleroma.z.org", 354 - "change": -0.001, 355 - "user_change": -173 358 + "host": "mapstodon.space", 359 + "change": -0.000806, 360 + "user_change": -122 356 361 }, 357 362 { 358 - "host": "openbiblio.social", 359 - "change": -0.000938, 360 - "user_change": -148 363 + "host": "loforo.com", 364 + "change": -0.000694, 365 + "user_change": 48 361 366 }, 362 367 { 363 - "host": "organica.social", 364 - "change": -0.000832, 365 - "user_change": -137 366 - }, 367 - { 368 - "host": "st.fdel.moe", 369 - "change": -0.000826, 370 - "user_change": -115 368 + "host": "m.cmx.im", 369 + "change": -0.000635, 370 + "user_change": -43 371 371 } 372 372 ] 373 373 } 374 374 }, 375 375 "monthly": { 376 - "shannon": -0.0107, 376 + "shannon": -0.0307, 377 377 "shannon_contrib": { 378 378 "increase": [ 379 379 { 380 380 "host": "theforkiverse.com", 381 - "change": 0.013765, 382 - "user_change": 3682 381 + "change": 0.0189, 382 + "user_change": 5329 383 383 }, 384 384 { 385 385 "host": "mstdn.z.org", 386 - "change": 0.01278, 386 + "change": 0.012583, 387 387 "user_change": 2348 388 388 }, 389 389 { 390 390 "host": "pixelfed.social", 391 - "change": 0.00449, 392 - "user_change": 4898 393 - }, 394 - { 395 - "host": "hawirkitabak.com", 396 - "change": 0.003304, 397 - "user_change": 496 391 + "change": 0.008837, 392 + "user_change": 9888 398 393 }, 399 394 { 400 395 "host": "pixelfed.au", 401 - "change": 0.002132, 402 - "user_change": 398 396 + "change": 0.00645, 397 + "user_change": 1294 403 398 }, 404 399 { 405 400 "host": "pixelfed.tokyo", 406 - "change": 0.002105, 407 - "user_change": 402 401 + "change": 0.003414, 402 + "user_change": 682 408 403 }, 409 404 { 410 - "host": "shitposter.world", 411 - "change": 0.001318, 412 - "user_change": 170 405 + "host": "hawirkitabak.com", 406 + "change": 0.003248, 407 + "user_change": 496 408 + }, 409 + { 410 + "host": "tingling.machinerunning.io", 411 + "change": 0.001597, 412 + "user_change": 215 413 413 }, 414 414 { 415 415 "host": "write.rlp.schule", 416 - "change": 0.000824, 417 - "user_change": 141 416 + "change": 0.001427, 417 + "user_change": 254 418 418 }, 419 419 { 420 - "host": "urbanists.social", 421 - "change": 0.000705, 422 - "user_change": 128 420 + "host": "shitposter.world", 421 + "change": 0.00129, 422 + "user_change": 169 423 423 }, 424 424 { 425 - "host": "pixelfed.de.", 426 - "change": 0.000693, 427 - "user_change": 274 425 + "host": "mastodon.social", 426 + "change": 0.001249, 427 + "user_change": 15486 428 428 } 429 429 ], 430 430 "decrease": [ 431 431 { 432 + "host": "troet.cafe", 433 + "change": -0.010862, 434 + "user_change": -2611 435 + }, 436 + { 432 437 "host": "gram.social", 433 - "change": -0.003856, 434 - "user_change": -1000 438 + "change": -0.009576, 439 + "user_change": -2590 435 440 }, 436 441 { 437 442 "host": "fed.brid.gy", 438 - "change": -0.001909, 439 - "user_change": 262 443 + "change": -0.003759, 444 + "user_change": 528 440 445 }, 441 446 { 442 - "host": "micro.blog", 443 - "change": -0.001887, 444 - "user_change": -388 447 + "host": "mostr.pub", 448 + "change": -0.001926, 449 + "user_change": 680 445 450 }, 446 451 { 447 - "host": "yourpix.au", 448 - "change": -0.001069, 449 - "user_change": -140 452 + "host": "pix.netfreaks.fr", 453 + "change": -0.001483, 454 + "user_change": -223 450 455 }, 451 456 { 452 457 "host": "lemmy.world", 453 - "change": -0.001049, 454 - "user_change": -81 458 + "change": -0.00148, 459 + "user_change": 38 455 460 }, 456 461 { 457 - "host": "sociale.network", 458 - "change": -0.001048, 459 - "user_change": -152 460 - }, 461 - { 462 - "host": "pleroma.z.org", 463 - "change": -0.001, 464 - "user_change": -173 462 + "host": "micro.blog", 463 + "change": -0.00144, 464 + "user_change": -164 465 465 }, 466 466 { 467 - "host": "openbiblio.social", 468 - "change": -0.000938, 469 - "user_change": -148 467 + "host": "loforo.com", 468 + "change": -0.001247, 469 + "user_change": 80 470 470 }, 471 471 { 472 - "host": "organica.social", 473 - "change": -0.000832, 474 - "user_change": -137 472 + "host": "pleroma.z.org", 473 + "change": -0.001196, 474 + "user_change": -173 475 475 }, 476 476 { 477 - "host": "st.fdel.moe", 478 - "change": -0.000826, 479 - "user_change": -115 477 + "host": "pixelfed.uno", 478 + "change": -0.001123, 479 + "user_change": -54 480 480 } 481 481 ] 482 482 } ··· 484 484 }, 485 485 "at": { 486 486 "weekly": { 487 - "shannon": -0.0011, 487 + "shannon": -0.0004, 488 488 "shannon_contrib": { 489 489 "increase": [ 490 490 { 491 - "host": "skystack.xyz", 492 - "change": 6.3e-05, 493 - "user_change": 60 491 + "host": "blacksky.app", 492 + "change": 0.000287, 493 + "user_change": 325 494 + }, 495 + { 496 + "host": "northsky.social", 497 + "change": 0.000101, 498 + "user_change": 65 494 499 }, 495 500 { 496 501 "host": "pds.sprk.so", 497 - "change": 3.6e-05, 498 - "user_change": 29 502 + "change": 5.7e-05, 503 + "user_change": 44 504 + }, 505 + { 506 + "host": "skystack.xyz", 507 + "change": 5.1e-05, 508 + "user_change": 51 499 509 }, 500 510 { 501 511 "host": "pds.ridgeway.dev", ··· 503 513 "user_change": 16 504 514 }, 505 515 { 506 - "host": "northsky.social", 507 - "change": 3.3e-05, 508 - "user_change": 22 516 + "host": "buttercup.wizardry.systems", 517 + "change": 3e-05, 518 + "user_change": 16 509 519 }, 510 520 { 511 - "host": "pds.rip", 512 - "change": 2.3e-05, 513 - "user_change": 12 521 + "host": "nstar.social", 522 + "change": 2.9e-05, 523 + "user_change": 14 514 524 }, 515 525 { 516 - "host": "dev-pds.periwinkle.social", 517 - "change": 2.1e-05, 518 - "user_change": 9 526 + "host": "climateai.org", 527 + "change": 2.9e-05, 528 + "user_change": 18 519 529 }, 520 530 { 521 - "host": "pds.quack.space", 522 - "change": 1.9e-05, 523 - "user_change": 9 531 + "host": "bluesky.bestofmodels.blog", 532 + "change": 2.4e-05, 533 + "user_change": 11 524 534 }, 525 535 { 526 - "host": "pds-staging.ridgeway.network", 527 - "change": 1.6e-05, 528 - "user_change": 7 529 - }, 530 - { 531 - "host": "pds2.dolciss.net", 532 - "change": 1.6e-05, 533 - "user_change": 7 534 - }, 535 - { 536 - "host": "psrd.club", 537 - "change": 1.6e-05, 538 - "user_change": 7 536 + "host": "pds.rip", 537 + "change": 2e-05, 538 + "user_change": 11 539 539 } 540 540 ], 541 541 "decrease": [ 542 542 { 543 543 "host": "randomly-generated.ngrok-free.app", 544 - "change": -0.000262, 545 - "user_change": 0 544 + "change": -0.000239, 545 + "user_change": 1 546 546 }, 547 547 { 548 548 "host": "tngl.sh", 549 - "change": -0.000227, 550 - "user_change": -149 549 + "change": -0.000229, 550 + "user_change": -154 551 551 }, 552 552 { 553 - "host": "blacksky.app", 554 - "change": -0.000153, 555 - "user_change": -77 553 + "host": "gems.xyz", 554 + "change": -0.000172, 555 + "user_change": -104 556 556 }, 557 557 { 558 - "host": ".host.bsky.network", 559 - "change": -0.000142, 560 - "user_change": 94062 558 + "host": "surf.social", 559 + "change": -0.000168, 560 + "user_change": -107 561 561 }, 562 562 { 563 - "host": "gems.xyz", 564 - "change": -0.000133, 565 - "user_change": -79 563 + "host": "gumby.social", 564 + "change": -9.3e-05, 565 + "user_change": -51 566 566 }, 567 567 { 568 - "host": "gumby.social", 569 - "change": -7.9e-05, 570 - "user_change": -43 568 + "host": ".host.bsky.network", 569 + "change": -5.5e-05, 570 + "user_change": 87820 571 571 }, 572 572 { 573 573 "host": "atproto.brid.gy", 574 - "change": -5.3e-05, 575 - "user_change": 316 574 + "change": -3e-05, 575 + "user_change": 318 576 576 }, 577 577 { 578 - "host": "zio.blue", 579 - "change": -4.3e-05, 580 - "user_change": -22 578 + "host": "pds.bsky.yinzcloud.net", 579 + "change": -3e-05, 580 + "user_change": -14 581 581 }, 582 582 { 583 - "host": "bsky.bestofmodels.blog", 584 - "change": -3.7e-05, 585 - "user_change": -20 583 + "host": "at.app.wafrn.net", 584 + "change": -2.3e-05, 585 + "user_change": -9 586 586 }, 587 587 { 588 - "host": "pds.bsky.yinzcloud.net", 589 - "change": -3.6e-05, 590 - "user_change": -18 588 + "host": "pegasus.ldev", 589 + "change": -2.1e-05, 590 + "user_change": -9 591 591 } 592 592 ] 593 593 } 594 594 }, 595 595 "monthly": { 596 - "shannon": -0.0009, 596 + "shannon": -0.0011, 597 597 "shannon_contrib": { 598 598 "increase": [ 599 599 { 600 600 "host": "x.mt.social", 601 - "change": 0.00022, 601 + "change": 0.000209, 602 602 "user_change": 161 603 603 }, 604 604 { 605 605 "host": "pds.sprk.so", 606 - "change": 9.8e-05, 607 - "user_change": 71 606 + "change": 0.000155, 607 + "user_change": 115 608 608 }, 609 609 { 610 - "host": "climateai.org", 611 - "change": 7.9e-05, 612 - "user_change": 44 610 + "host": "northsky.social", 611 + "change": 0.000134, 612 + "user_change": 87 613 613 }, 614 614 { 615 - "host": "skystack.xyz", 616 - "change": 5.6e-05, 615 + "host": "climateai.org", 616 + "change": 0.000108, 617 617 "user_change": 62 618 618 }, 619 619 { 620 - "host": "northsky.social", 621 - "change": 4.6e-05, 622 - "user_change": 30 620 + "host": "blacksky.app", 621 + "change": 6.8e-05, 622 + "user_change": 218 623 623 }, 624 624 { 625 - "host": "pds.ridgeway.dev", 626 - "change": 3.5e-05, 627 - "user_change": 16 625 + "host": "pds.rip", 626 + "change": 3.8e-05, 627 + "user_change": 21 628 628 }, 629 629 { 630 630 "host": "sds-eu-west4.test.certified.app", 631 - "change": 2.8e-05, 632 - "user_change": 14 631 + "change": 3.6e-05, 632 + "user_change": 19 633 633 }, 634 634 { 635 - "host": "pds.rip", 636 - "change": 2.6e-05, 637 - "user_change": 14 635 + "host": "buttercup.wizardry.systems", 636 + "change": 3.5e-05, 637 + "user_change": 19 638 638 }, 639 639 { 640 - "host": "dev-pds.periwinkle.social", 641 - "change": 2.1e-05, 642 - "user_change": 9 640 + "host": "pds.ridgeway.dev", 641 + "change": 3.5e-05, 642 + "user_change": 16 643 643 }, 644 644 { 645 - "host": "pds-dev.heart-land.io", 646 - "change": 2e-05, 647 - "user_change": 9 645 + "host": "dev-pds.periwinkle.social", 646 + "change": 3.3e-05, 647 + "user_change": 15 648 648 } 649 649 ], 650 650 "decrease": [ 651 651 { 652 652 "host": "randomly-generated.ngrok-free.app", 653 - "change": -0.000399, 654 - "user_change": 0 653 + "change": -0.000627, 654 + "user_change": 1 655 655 }, 656 656 { 657 - "host": "tngl.sh", 658 - "change": -0.000217, 659 - "user_change": -137 657 + "host": "atproto.brid.gy", 658 + "change": -0.000276, 659 + "user_change": 568 660 660 }, 661 661 { 662 - "host": "blacksky.app", 663 - "change": -0.000148, 664 - "user_change": -40 662 + "host": "tngl.sh", 663 + "change": -0.000218, 664 + "user_change": -131 665 665 }, 666 666 { 667 667 "host": ".host.bsky.network", 668 - "change": -0.000144, 669 - "user_change": 141622 668 + "change": -0.000195, 669 + "user_change": 225751 670 670 }, 671 671 { 672 672 "host": "gems.xyz", 673 - "change": -0.000136, 674 - "user_change": -79 675 - }, 676 - { 677 - "host": "atproto.brid.gy", 678 - "change": -0.000125, 679 - "user_change": 421 673 + "change": -0.000187, 674 + "user_change": -108 680 675 }, 681 676 { 682 677 "host": "gumby.social", 683 - "change": -7.5e-05, 684 - "user_change": -40 678 + "change": -0.0001, 679 + "user_change": -53 685 680 }, 686 681 { 687 - "host": "zio.blue", 688 - "change": -4.2e-05, 689 - "user_change": -21 682 + "host": "surf.social", 683 + "change": -9.7e-05, 684 + "user_change": -51 690 685 }, 691 686 { 692 687 "host": "pds.bsky.yinzcloud.net", 693 - "change": -3.9e-05, 694 - "user_change": -19 688 + "change": -6.4e-05, 689 + "user_change": -31 690 + }, 691 + { 692 + "host": "y.mt.social", 693 + "change": -4.7e-05, 694 + "user_change": -22 695 695 }, 696 696 { 697 697 "host": "bsky.bestofmodels.blog", 698 - "change": -3.6e-05, 699 - "user_change": -18 698 + "change": -4.4e-05, 699 + "user_change": -21 700 700 } 701 701 ] 702 702 } ··· 709 709 "increase": [ 710 710 { 711 711 "host": "gitlabext.wsl.ch", 712 + "change": 2e-06, 713 + "user_change": 45 714 + }, 715 + { 716 + "host": "gitlab.esss.lu.se", 712 717 "change": 1e-06, 713 - "user_change": 21 718 + "user_change": 57 719 + }, 720 + { 721 + "host": "git.mihon.tech", 722 + "change": 1e-06, 723 + "user_change": 19 714 724 }, 715 725 { 716 - "host": "git.tstarr.us", 726 + "host": "git.io-warnemuende.de", 717 727 "change": 0.0, 718 - "user_change": 4 728 + "user_change": 10 719 729 }, 720 730 { 721 731 "host": "gitea.com", 722 732 "change": 0.0, 723 - "user_change": 30 733 + "user_change": 37 724 734 }, 725 735 { 726 736 "host": "gitlab.huma-num.fr", 727 737 "change": 0.0, 728 - "user_change": 6 729 - }, 730 - { 731 - "host": "gitlab.esss.lu.se", 732 - "change": 0.0, 733 - "user_change": 17 738 + "user_change": 7 734 739 }, 735 740 { 736 741 "host": "gitea.michalczyk.pro", ··· 738 743 "user_change": 2 739 744 }, 740 745 { 741 - "host": "git.toradex.com", 746 + "host": "git.alpaga.dev", 742 747 "change": 0.0, 743 748 "user_change": 2 744 749 }, 745 750 { 746 - "host": "git.leximpact.dev", 751 + "host": "git.toradex.com", 747 752 "change": 0.0, 748 753 "user_change": 2 749 754 }, 750 755 { 751 - "host": "gitlab.opencode.de", 752 - "change": 0.0, 753 - "user_change": 5 754 - }, 755 - { 756 - "host": "gitlab.dsi.universite-paris-saclay.fr", 756 + "host": "source.denx.de", 757 757 "change": 0.0, 758 - "user_change": 14 758 + "user_change": 2 759 759 } 760 760 ], 761 761 "decrease": [ 762 762 { 763 763 "host": "gitlab.com", 764 - "change": -0.000147, 765 - "user_change": 1066 764 + "change": -0.00016, 765 + "user_change": 1172 766 766 }, 767 767 { 768 768 "host": "github", 769 - "change": -8.1e-05, 770 - "user_change": 929061 769 + "change": -8.8e-05, 770 + "user_change": 1013878 771 771 }, 772 772 { 773 773 "host": "bitbucket", 774 - "change": -7.5e-05, 775 - "user_change": 2539 774 + "change": -8.2e-05, 775 + "user_change": 2719 776 776 }, 777 777 { 778 778 "host": "packagist", 779 - "change": -2e-05, 780 - "user_change": 37 779 + "change": -2.2e-05, 780 + "user_change": 45 781 781 }, 782 782 { 783 783 "host": "main", 784 - "change": -1.1e-05, 785 - "user_change": -1 784 + "change": -1.2e-05, 785 + "user_change": 1 786 786 }, 787 787 { 788 788 "host": "gitorious", 789 - "change": -8e-06, 789 + "change": -9e-06, 790 790 "user_change": 0 791 791 }, 792 792 { 793 793 "host": "launchpad", 794 794 "change": -8e-06, 795 - "user_change": 4 795 + "user_change": 0 796 796 }, 797 797 { 798 798 "host": "googlecode", 799 - "change": -6e-06, 799 + "change": -7e-06, 800 800 "user_change": 0 801 801 }, 802 802 { 803 803 "host": "salsa.debian.org", 804 804 "change": -5e-06, 805 - "user_change": 8 805 + "user_change": 9 806 806 }, 807 807 { 808 808 "host": "git.drupalcode.org", 809 - "change": -4e-06, 809 + "change": -5e-06, 810 810 "user_change": 0 811 811 } 812 812 ] ··· 823 823 }, 824 824 { 825 825 "host": "git.kernel.org", 826 - "change": 4e-06, 827 - "user_change": 114 826 + "change": 3e-06, 827 + "user_change": 113 828 828 }, 829 829 { 830 830 "host": "gitlab.dsi.universite-paris-saclay.fr", 831 831 "change": 3e-06, 832 - "user_change": 142 832 + "user_change": 136 833 833 }, 834 834 { 835 835 "host": "git.windmaker.net", ··· 837 837 "user_change": 48 838 838 }, 839 839 { 840 + "host": "gitlab.esss.lu.se", 841 + "change": 2e-06, 842 + "user_change": 125 843 + }, 844 + { 845 + "host": "gitlabext.wsl.ch", 846 + "change": 2e-06, 847 + "user_change": 45 848 + }, 849 + { 840 850 "host": "git.jordan.im", 841 851 "change": 2e-06, 842 852 "user_change": 32 ··· 847 857 "user_change": 24 848 858 }, 849 859 { 850 - "host": "gitlabext.wsl.ch", 860 + "host": "git.mihon.tech", 851 861 "change": 1e-06, 852 - "user_change": 21 853 - }, 854 - { 855 - "host": "gitlab.esss.lu.se", 856 - "change": 1e-06, 857 - "user_change": 81 862 + "user_change": 19 858 863 }, 859 864 { 860 865 "host": "gitea.com", 861 - "change": 0.0, 862 - "user_change": 123 863 - }, 864 - { 865 - "host": "code.peren.fr", 866 - "change": 0.0, 867 - "user_change": 7 866 + "change": 1e-06, 867 + "user_change": 138 868 868 } 869 869 ], 870 870 "decrease": [ 871 871 { 872 872 "host": "gitlab.com", 873 - "change": -0.000676, 874 - "user_change": 4577 873 + "change": -0.000692, 874 + "user_change": 4741 875 875 }, 876 876 { 877 877 "host": "github", 878 - "change": -0.00037, 879 - "user_change": 4206993 878 + "change": -0.00038, 879 + "user_change": 4324332 880 880 }, 881 881 { 882 882 "host": "bitbucket", 883 - "change": -0.000332, 884 - "user_change": 12223 883 + "change": -0.000344, 884 + "user_change": 12251 885 885 }, 886 886 { 887 887 "host": "packagist", 888 - "change": -9e-05, 889 - "user_change": 310 888 + "change": -9.3e-05, 889 + "user_change": 259 890 890 }, 891 891 { 892 892 "host": "main", 893 - "change": -5.1e-05, 894 - "user_change": -1 893 + "change": -5.3e-05, 894 + "user_change": 0 895 895 }, 896 896 { 897 897 "host": "gitorious", 898 - "change": -3.6e-05, 898 + "change": -3.7e-05, 899 899 "user_change": 0 900 900 }, 901 901 { 902 902 "host": "launchpad", 903 - "change": -3.5e-05, 904 - "user_change": 14 903 + "change": -3.6e-05, 904 + "user_change": 8 905 905 }, 906 906 { 907 907 "host": "googlecode", ··· 911 911 { 912 912 "host": "salsa.debian.org", 913 913 "change": -2.2e-05, 914 - "user_change": 62 914 + "user_change": 67 915 915 }, 916 916 { 917 917 "host": "git.drupalcode.org", 918 - "change": -1.9e-05, 918 + "change": -2e-05, 919 919 "user_change": 0 920 920 } 921 921 ] 922 922 } 923 923 } 924 + }, 925 + "fedi_software": { 926 + "weekly": { 927 + "shannon": 0.0, 928 + "shannon_contrib": { 929 + "increase": [], 930 + "decrease": [] 931 + } 932 + }, 933 + "monthly": { 934 + "shannon": 0.0, 935 + "shannon_contrib": { 936 + "increase": [], 937 + "decrease": [] 938 + } 939 + } 924 940 } 941 + }, 942 + "bsky_verifiers": { 943 + "HHI": 6795, 944 + "shannon": 0.907, 945 + "simpson": 0.3205, 946 + "servers": 21, 947 + "biggest_abs": 5217, 948 + "biggest_pct": 82.22, 949 + "rest_abs": 1128, 950 + "rest_pct": 17.78, 951 + "b_vals": [ 952 + [ 953 + 25, 954 + 1 955 + ], 956 + [ 957 + 50, 958 + 1 959 + ], 960 + [ 961 + 75, 962 + 1 963 + ], 964 + [ 965 + 90, 966 + 4 967 + ], 968 + [ 969 + 99, 970 + 13 971 + ], 972 + [ 973 + 99.5, 974 + 16 975 + ] 976 + ], 977 + "lastUpdate": "01-24-2026", 978 + "dataFile": "data/bsky-verifiers/2026-01-24T05:54:50Z.csv" 979 + }, 980 + "fedi_software": { 981 + "HHI": 4225, 982 + "shannon": 1.4738, 983 + "simpson": 0.5775, 984 + "servers": 123, 985 + "biggest_abs": 730520, 986 + "biggest_pct": 63.15, 987 + "rest_abs": 426352, 988 + "rest_pct": 36.85, 989 + "b_vals": [ 990 + [ 991 + 25, 992 + 1 993 + ], 994 + [ 995 + 50, 996 + 1 997 + ], 998 + [ 999 + 75, 1000 + 2 1001 + ], 1002 + [ 1003 + 90, 1004 + 6 1005 + ], 1006 + [ 1007 + 99, 1008 + 19 1009 + ], 1010 + [ 1011 + 99.5, 1012 + 23 1013 + ] 1014 + ], 1015 + "lastUpdate": "01-24-2026", 1016 + "dataFile": "data/fedi-software/2026-01-24T05:54:50Z.csv" 925 1017 } 926 1018 }