#!/usr/bin/env python3 import json collections = { 'Popfeed': ('social-popfeed', 'pop culture hub'), 'PinkSea': ('com-shinolabs-pinksea', 'oekaki on atproto'), 'WhiteWind': ('com-whtwnd', 'markdown blog service'), 'Smoke Signal': ('events-smokesignal', 'manage events and RSVPs'), 'teal.fm': ('fm-teal', 'your music, beautifully tracked'), 'Frontpage': ('fyi-unravel-frontpage', 'a decentralised and federated link aggregator'), 'Flushes': ('im-flushing', 'The Decentralized Toilet Network of Planet Earth & Simulation 12B'), 'Streamplace': ('place-stream', 'live video on the AT Protocol'), 'Tangled': ('sh-tangled', 'tightly-knit social coding'), 'Spark': ('so-sprk', 'short-form video/photo app'), 'Statusphere': ('xyz-statusphere', 'atproto quick start'), 'Roomy': ('space-roomy', 'group chat on atproto'), 'ATFile': ('blue-zio-atfile', 'store and retrieve files'), 'Blue Badge': ('blue-badge', 'badges for atproto handles'), '2048': ('blue-twentyfortyeight', '2048 on atproto'), 'recipe.exchange': ('exchange-recipe', 'discover and share your favorite recipes'), 'Linkat': ('blue-linkat', 'link collections'), 'Rocksky': ('app-rocksky', 'decentralized music tracking and discovery platform'), 'Leaflet': ('pub-leaflet', 'social publishing / blogging'), 'Wamellow': ('com-wamellow', 'bluesky to discord notifications'), 'Grain': ('social-grain', 'a photo sharing platform'), 'Anisota': ('net-anisota', 'a new, experimental way to use social media'), 'BookHive': ('buzz-bookhive', 'manage, organize, and review your books anywhere'), 'Woosh': ('link-woosh', 'effortlessly share everything you create, curate, and sell'), 'Snowpost': ('st-snowpo', 'a simple, minimalist writing platform'), 'Skylights': ('my-skylights', 'a simple, minimalist writing platform'), 'Status': ('io-zzstoatzz-status', 'a personal status tracker built on at protocol'), 'Yōten': ('app-yoten', 'a social tracker for your language learning journey'), 'Flashes': ('blue-flashes', 'a photo viewing client for u'), 'at://work': ('place-atwork', 'Your Career. Your Data. Your Place.'), 'Monomarks': ('at-monomarks', 'a place for sharing and discovering interesting links'), 'Wafrn': ('net-wafrn', 'a federated social media inspired by Tumblr'), 'Nooki': ('community-nooki', 'a federated social media inspired by Tumblr'), 'xcvr': ('org-xcvr', 'hyper-real-time communication on atproto'), 'Lanyards': ('app-lanyards', 'one link to make your research life easier to share'), 'Thought Stream': ('stream-thought', 'an experimental real-time, global, multi-agent communication system with optional human participation'), 'plyr.fm': ('fm-plyr', 'music on atproto'), 'Sidetrail': ('app-sidetrail', 'a little app for sharing "trails"'), 'Anchor': ('app-dropanchor', 'an experiment in geolocation on the AT protocol'), 'ATProtoFans': ('com-atprotofans', 'Connecting Fans and Creators'), # 'name': ('nsid-with-dashes', 'description'), } values = [] defs = [] key_func = lambda obj: str.casefold(obj[0]) for name, (identifier, description) in sorted(collections.items(), key=key_func): nsid = identifier.replace('-', '.') if identifier == 'blue-twentyfortyeight': # https://atproto.com/specs/label#recommended-string-syntax nsid = 'blue.2048' values.append(identifier) defs.append(dict( blurs = 'none', severity = 'inform', adultOnly = False, identifier = identifier, defaultSetting = 'warn', locales = [dict( lang = 'en', name = name, description = f'{description} ({nsid}.*)', )], )) doc = { 'labelValues': values, 'labelValueDefinitions': defs, } print(json.dumps(doc))