{"repo": "best-of-ai/best-of-ai", "files": {"scripts/add-ranks.py": {"f75c8944c2105ed67bab1929845eb1cac0f785da": {"t": 1785674651.0282598, "n": 34290, "h": "b4ed3cd3f6db8ecc", "c": "#!/usr/bin/env python3\n\"\"\"Assign a quality rank (1–10) to every tool file.\n\n10 = iconic, category-defining\n 9 = widely used, strong brand\n 8 = popular, well-known\n 7 = solid, established\n 6 = decent, known in niche\n 5 = default (unknown / newer tools)\n 4 = limited info / very niche\n\"\"\"\n\nimport os\nimport re\n\nTOOLS_DIR = os.path.join(os.path.dirname(__file__), '..', 'content', 'tools')\n\n# Explicit rank assignments keyed by slug\nRANKS = {\n # ── 10 — iconic / category-defining ─────────────────────────────────────\n 'chatgpt': 10,\n 'claude': 10,\n 'claude-3': 10,\n 'gemini': 10,\n 'gemini-pro': 10,\n 'gpt-4': 10,\n 'midjourney': 10,\n 'stable-diffusion': 10,\n 'dall-e-3': 10,\n 'github-copilot': 10,\n 'cursor': 10,\n 'notion': 10,\n 'notion-ai': 10,\n 'figma': 10,\n 'canva': 10,\n 'grammarly': 10,\n 'perplexity': 10,\n 'perplexity-search': 10,\n 'elevenlabs': 10,\n 'runway': 10,\n 'suno': 10,\n 'siri': 10,\n 'google-assistant': 10,\n 'duolingo': 10,\n 'shopify': 10,\n 'stripe': 10,\n 'salesforce': 10,\n 'hubspot': 10,\n 'hubspot-crm': 10,\n 'airtable': 10,\n 'zapier': 10,\n 'zoom-ai': 10,\n 'slack-ai': 10,\n 'asana': 10,\n 'linear': 10,\n 'grok': 10,\n 'llama-3': 10,\n 'adobe-firefly': 10,\n 'adobe-premiere-pro-ai': 10,\n 'deepseek': 10,\n 'postman': 10,\n 'datadog': 10,\n 'crowdstrike': 10,\n 'okta': 10,\n 'zendesk': 10,\n 'intercom': 10,\n 'hubspot-business': 10,\n 'microsoft-copilot': 10,\n 'sora': 10,\n 'luma-dream-machine': 10,\n\n # ── 9 — widely used, strong brand ────────────────────────────────────────\n 'copilot-workspace': 9,\n 'windsurf': 9,\n 'aider': 9,\n 'replit': 9,\n 'bolt-new': 9,\n 'lovable': 9,\n 'v0': 9,\n 'devin': 9,\n 'cline': 9,\n 'cursor-composer': 9,\n 'amazon-q': 9,\n 'amazon-codewhisperer': 9,\n 'jasper': 9,\n 'copy-ai': 9,\n 'writesonic': 9,\n 'notion-notes': 9,\n 'obsidian': 9,\n 'otter-ai': 9,\n 'fireflies-ai': 9,\n 'heygen': 9,\n 'synthesia': 9,\n 'descript': 9,\n 'riverside': 9,\n 'adobe-podcast': 9,\n 'murf': 9,\n 'eleven-labs-sound-effects': 9,\n 'runway-video': 9,\n 'gen-3-alpha': 9,\n 'kling-ai': 9,\n 'pika-labs': 9,\n 'veo-2': 9,\n 'ideogram': 9,\n 'flux': 9,\n 'adobe-express': 9,\n 'adobe-lightroom-ai': 9,\n 'adobe-acrobat-ai': 9,\n 'adobe-sensei': 9,\n 'canva-infographics': 9,\n 'gamma': 9,\n 'beautiful-ai': 9,\n 'framer': 9,\n 'webflow': 9,\n 'bubble': 9,\n 'make': 9,\n 'n8n': 9,\n 'monday-com': 9,\n 'clickup': 9,\n 'todoist': 9,\n 'notion-notes': 9,\n 'grammarly': 9,\n 'quillbot': 9,\n 'wordtune': 9,\n 'deepl': 9,\n 'google-translate': 9,\n 'character-ai': 9,\n 'replika': 9,\n 'meta-ai': 9,\n 'amazon-polly': 9,\n 'wellsaid-labs': 9,\n 'playht': 9,\n 'whisper': 9,\n 'assemblyai': 9,\n 'rev': 9,\n 'krisp': 9,\n 'cleanvoice': 9,\n 'notebooklm': 9,\n 'perplexity-research': 9,\n 'elicit': 9,\n 'consensus': 9,\n 'scispace': 9,\n 'semantic-scholar': 9,\n 'scite-ai': 9,\n 'github-copilot': 9,\n 'tabnine': 9,\n 'codeium': 9,\n 'supermaven': 9,\n 'sourcegraph-cody': 9,\n 'aws-rekognition': 9,\n 'clarifai': 9,\n 'roboflow': 9,\n 'scale-ai': 9,\n 'pinecone': 9,\n 'langchain': 9,\n 'llamaindex': 9,\n 'hugging-face': 9,\n 'mistral': 9,\n 'cohere': 9,\n 'ai21-labs': 9,\n 'gpt-4': 9,\n 'openai-o3': 9,\n 'gemma': 9,\n 'microsoft-phi': 9,\n 'amazon-bedrock': 9,\n 'azure-openai': 9,\n 'vertex-ai': 9,\n 'google-ai-studio': 9,\n 'groq': 9,\n 'anthropic': 9,\n 'salesforce-einstein': 9,\n 'hubspot': 9,\n 'pipedrive': 9,\n 'zoho-crm': 9,\n 'zendesk': 9,\n 'freshdesk': 9,\n 'intercom': 9,\n 'drift': 9,\n 'tableau': 9,\n 'power-bi': 9,\n 'metabase': 9,\n 'amplitude-ai': 9,\n 'mixpanel': 9,\n 'semrush': 9,\n 'ahrefs': 9,\n 'surfer-seo': 9,\n 'clearscope': 9,\n 'jasper-marketing': 9,\n 'hubspot': 9,\n 'mailchimp': 9,\n 'buffer': 9,\n 'hootsuite': 9,\n 'sprout-social': 9,\n 'wiz': 9,\n 'darktrace': 9,\n 'sentry': 9,\n 'new-relic': 9,\n 'stripe': 9,\n 'brex': 9,\n 'rippling': 9,\n 'workday': 9,\n 'bamboohr': 9,\n 'greenhouse': 9,\n 'lever': 9,\n 'procore': 9,\n 'vanta': 9,\n 'drata': 9,\n\n # ── 8 — popular, well-known ───────────────────────────────────────────────\n 'claude-code': 8,\n 'google-jules': 8,\n 'qodo-ai': 8,\n 'mutable-ai': 8,\n 'jetbrains-ai': 8,\n 'bito-ai': 8,\n 'blackbox-ai': 8,\n 'aide': 8,\n 'agentgpt': 8,\n 'autogpt': 8,\n 'crewai': 8,\n 'langflow': 8,\n 'flowise': 8,\n 'dify': 8,\n 'composio': 8,\n 'openai-operator': 8,\n 'manus': 8,\n 'openhands': 8,\n 'smolagents': 8,\n 'autogen': 8,\n 'coze': 8,\n 'voiceflow': 8,\n 'botpress': 8,\n 'manychat': 8,\n 'typeform': 8,\n 'chatbase': 8,\n 'tidio': 8,\n 'capacity': 8,\n 'forethought-ai': 8,\n 'kustomer-ai': 8,\n 'gladly': 8,\n 'gorgias': 8,\n 'balto': 8,\n 'observe-ai': 8,\n 'talkdesk': 8,\n 'helpshift': 8,\n 'netomi': 8,\n 'midjourney': 8,\n 'adobe-firefly': 8,\n 'stable-diffusion': 8,\n 'comfyui': 8,\n 'civitai': 8,\n 'mage-space': 8,\n 'playground-ai': 8,\n 'krea-ai': 8,\n 'seaart': 8,\n 'leonardo-ai': 8,\n 'getimg-ai': 8,\n 'artbreeder': 8,\n 'freepik-ai': 8,\n 'generated-photos': 8,\n 'stockimg-ai': 8,\n 'nightcafe': 8,\n 'starryai': 8,\n 'dream-wombo': 8,\n 'craiyon': 8,\n 'bing-image-creator': 8,\n 'photoroom': 8,\n 'removebg': 8,\n 'clipdrop': 8,\n 'cleanup-pictures': 8,\n 'background-remover': 8,\n 'erasebg': 8,\n 'lensa-ai': 8,\n 'fotor': 8,\n 'pixlr': 8,\n 'befunky': 8,\n 'luminar-neo': 8,\n 'on1-photo-ai': 8,\n 'topaz-photo-ai': 8,\n 'adobe-lightroom-ai': 8,\n 'remini': 8,\n 'upscayl': 8,\n 'neural-love': 8,\n 'picsart-ai': 8,\n 'pixelcut': 8,\n 'vectorizer-ai': 8,\n 'topaz-video-ai': 8,\n 'real-esrgan': 8,\n 'aive': 8,\n 'waifu2x': 8,\n 'opus-clip': 8,\n 'munch': 8,\n 'capcut': 8,\n 'veed-io': 8,\n 'invideo': 8,\n 'flexclip': 8,\n 'kapwing': 8,\n 'clideo': 8,\n 'wave-video': 8,\n 'wondershare-filmora': 8,\n 'pictory': 8,\n 'captions-ai': 8,\n 'vidyo-ai': 8,\n 'happy-scribe': 8,\n 'subtitlebee': 8,\n 'otter-ai-subtitles': 8,\n 'rev': 8,\n 'heygen': 8,\n 'd-id': 8,\n 'synthesia': 8,\n 'colossyan': 8,\n 'elai-io': 8,\n 'aiva': 8,\n 'suno': 8,\n 'udio': 8,\n 'mubert': 8,\n 'soundraw': 8,\n 'beatoven-ai': 8,\n 'boomy': 8,\n 'loudly': 8,\n 'altered-ai': 8,\n 'resemble-ai': 8,\n 'replica-studios': 8,\n 'murf-voice': 8,\n 'speechify': 8,\n 'voicemod': 8,\n 'cartesia': 8,\n 'hume-ai': 8,\n 'lovo-ai': 8,\n 'kokoro-tts': 8,\n 'deepgram': 8,\n 'notta': 8,\n 'sonix': 8,\n 'happyscribe': 8,\n 'avoma': 8,\n 'fathom': 8,\n 'meetgeek': 8,\n 'grain': 8,\n 'claap': 8,\n 'read-ai': 8,\n 'fellow': 8,\n 'sembly-ai': 8,\n 'tldv': 8,\n 'tactiq': 8,\n 'supernormal': 8,\n 'noty-ai': 8,\n 'slack-ai': 8,\n 'notion': 8,\n 'obsidian-ai': 8,\n 'logseq': 8,\n 'roam-research': 8,\n 'heptabase': 8,\n 'tana': 8,\n 'craft-docs': 8,\n 'amplenote': 8,\n 'remnote': 8,\n 'mem': 8,\n 'reflect': 8,\n 'anytype': 8,\n 'capacities': 8,\n 'liner': 8,\n 'readwise-reader': 8,\n 'glean': 8,\n 'notion-notes': 8,\n 'exa-ai': 8,\n 'you-search': 8,\n 'perplexity-search': 8,\n 'andi': 8,\n 'kagi': 8,\n 'arc-browser': 8,\n 'brave-leo': 8,\n 'devv-ai': 8,\n 'phind': 8,\n 'google-maps': 8,\n 'apple-maps': 8,\n 'yelp': 8,\n 'foursquare': 8,\n 'bing-chat': 8,\n 'perplexity-labs': 8,\n 'perplexity-pages': 8,\n 'gamma': 8,\n 'decktopus': 8,\n 'beautiful-ai': 8,\n 'tome': 8,\n 'plus-ai': 8,\n 'pitch': 8,\n 'slidebean': 8,\n 'slidesai': 8,\n 'visme-ai': 8,\n 'powtoon': 8,\n 'animaker': 8,\n 'vyond': 8,\n 'lottie': 8,\n 'after-effects': 8,\n 'rive': 8,\n 'spline': 8,\n 'luma-ai': 8,\n 'meshy-ai': 8,\n 'masterpiece-studio': 8,\n 'kaedim': 8,\n 'tripo3d': 8,\n 'polycam': 8,\n 'alpha3d': 8,\n 'meshcapade': 8,\n 'kahoot': 8,\n 'coursera': 8,\n 'udemy': 8,\n 'khan-academy': 8,\n 'khanmigo': 8,\n 'brilliant': 8,\n 'duolingo': 8,\n 'babbel': 8,\n 'busuu': 8,\n 'rosetta-stone': 8,\n 'quizlet-ai': 8,\n 'socratic': 8,\n 'chegg-ai': 8,\n 'dreambox-learning': 8,\n 'carnegie-learning': 8,\n 'ixl': 8,\n 'mathway': 8,\n 'studysmarter': 8,\n 'synthesis': 8,\n 'turnitin': 8,\n 'gptzero': 8,\n 'copyleaks': 8,\n 'scribbr': 8,\n 'connected-papers': 8,\n 'research-rabbit': 8,\n 'litmaps': 8,\n 'notebooklm': 8,\n 'notebook-lm-plus': 8,\n 'wolfram-alpha-ai': 8,\n 'explainpaper': 8,\n 'scholarcy': 8,\n 'scite-ai': 8,\n 'iris-ai': 8,\n 'scinapse': 8,\n 'dimensions': 8,\n 'lens-org': 8,\n 'inciteful': 8,\n 'openread': 8,\n 'undermind': 8,\n 'paper-digest': 8,\n 'perplexity-sonar': 8,\n 'harvey': 8,\n 'casetext': 8,\n 'donotpay': 8,\n 'ironclad': 8,\n 'juro': 8,\n 'kira-systems': 8,\n 'lexion': 8,\n 'lawgeex': 8,\n 'luminance': 8,\n 'robin-ai': 8,\n 'spellbook': 8,\n 'contractsafe': 8,\n 'agiloft': 8,\n 'contractpodai': 8,\n 'chatpdf': 8,\n 'humata': 8,\n 'notebooklm': 8,\n 'dovetail': 8,\n 'maze': 8,\n 'hotjar-ai': 8,\n 'attention-insight': 8,\n 'brandwatch': 8,\n 'crimson-hexagon': 8,\n 'semrush-market': 8,\n 'cb-insights': 8,\n 'similarweb': 8,\n 'pitchbook': 8,\n 'crunchbase': 8,\n 'alphasense': 8,\n 'morningstar-ai': 8,\n 'outreach': 8,\n 'salesloft': 8,\n 'gong': 8,\n 'chorus-ai': 8,\n 'clari': 8,\n 'apollo': 8,\n 'clay': 8,\n 'instantly': 8,\n 'lavender': 8,\n 'people-ai': 8,\n 'apollo-lead': 8,\n 'zoominfo': 8,\n 'linkedin-sales-navigator': 8,\n 'hunter': 8,\n 'conversica': 8,\n 'amplemarket': 8,\n 'demandbase': 8,\n 'attentive': 8,\n 'klaviyo-ai': 8,\n 'activecampaign-ai': 8,\n 'brevo-ai': 8,\n 'mailchimp': 8,\n 'mixmax': 8,\n 'superhuman': 8,\n 'spark-mail': 8,\n 'sanebox': 8,\n 'shortwave': 8,\n 'boomerang': 8,\n 'calendly': 8,\n 'acuity-scheduling': 8,\n 'motion': 8,\n 'clockwise': 8,\n 'reclaim-ai': 8,\n 'sunsama': 8,\n 'akiflow': 8,\n 'x-ai': 8,\n 'taskade': 8,\n 'height': 8,\n 'monday-com': 8,\n 'smartsheet-ai': 8,\n 'wrike': 8,\n 'paymo': 8,\n 'adcreative-ai': 8,\n 'pattern89': 8,\n 'pencil': 8,\n 'smartly': 8,\n 'kickresume': 8,\n 'resume-io': 8,\n 'rezi': 8,\n 'zety': 8,\n 'indeed': 8,\n 'linkedin': 8,\n 'glassdoor': 8,\n 'ziprecruiter': 8,\n 'workable': 8,\n 'smartrecruiters': 8,\n 'lemonade': 8,\n 'root-insurance': 8,\n 'next-insurance': 8,\n 'crowdstrike': 8,\n 'darktrace': 8,\n 'sentry': 8,\n 'bugsnag': 8,\n 'mapbox': 8,\n 'arcgis': 8,\n 'planet-labs': 8,\n 'climate-trace': 8,\n 'watershed': 8,\n 'carbon-trust': 8,\n 'aurora-solar': 8,\n 'labelbox': 8,\n 'appen': 8,\n 'cvat': 8,\n 'planetscale': 8,\n 'neon-db': 8,\n 'woebot': 8,\n 'wysa': 8,\n 'betterhelp': 8,\n 'headspace': 8,\n 'calm': 8,\n 'betterup': 8,\n 'mindmeister': 8,\n 'xmind': 8,\n 'drawio': 8,\n 'creately': 8,\n 'mermaid-chart': 8,\n 'gitbook': 8,\n 'confluence-ai': 8,\n 'myfitnesspal': 8,\n 'noom': 8,\n 'whoop': 8,\n 'fitbod': 8,\n 'duolingo': 8,\n 'hopper': 8,\n 'tripadvisor': 8,\n 'wanderlog': 8,\n 'alchemy-web3': 8,\n 'turbotax': 8,\n 'taxjar': 8,\n 'avalara': 8,\n 'teladoc': 8,\n 'doxy-me': 8,\n 'hudl': 8,\n 'catapult-sports': 8,\n 'samsara': 8,\n 'fleetio': 8,\n 'geotab': 8,\n 'procore': 8,\n 'autodesk-construction': 8,\n 'autogrid': 8,\n 'vanta': 8,\n 'drata': 8,\n 'onetrust': 8,\n 'bigid': 8,\n 'osano': 8,\n 'persona': 8,\n 'jumio': 8,\n 'okta': 8,\n 'cloudhealth': 8,\n 'turbonomic': 8,\n 'hopin': 8,\n 'bizzabo': 8,\n 'grip-events': 8,\n 'benchling': 8,\n 'dnanexus': 8,\n 'geneious': 8,\n 'atomwise': 8,\n 'schrodinger': 8,\n 'recursion': 8,\n 'viz-ai': 8,\n 'zebra-medical': 8,\n 'arterys': 8,\n 'papercup': 8,\n 'deepdub': 8,\n 'dubverse': 8,\n 'ready-player-me': 8,\n 'character-creator': 8,\n 'covariant': 8,\n 'intrinsic': 8,\n 'spire-global': 8,\n 'maxar': 8,\n 'stats-perform': 8,\n 'monkeylearn': 8,\n 'testim': 8,\n 'applitools': 8,\n 'mabl': 8,\n 'bonterra': 8,\n 'bloomerang': 8,\n 'cronometer': 8,\n 'embark': 8,\n 'patsnap': 8,\n 'mostly-ai': 8,\n 'gretel-ai': 8,\n 'tonic-ai': 8,\n\n # ── 7 — solid, established ────────────────────────────────────────────────\n 'agno-ai': 7,\n 'phidata': 7,\n 'e2b': 7,\n 'activepieces': 7,\n 'pipedream': 7,\n 'workato': 7,\n 'nintex': 7,\n 'power-automate': 7,\n 'power-automate-automation': 7,\n 'tray-io': 7,\n 'uipath': 7,\n 'airbyte-ai': 7,\n 'fivetran': 7,\n 'dbt-cloud': 7,\n 'h2o-ai': 7,\n 'datarobot': 7,\n 'obviously-ai': 7,\n 'julius-ai': 7,\n 'posthog-ai': 7,\n 'domo-ai': 7,\n 'sisense': 7,\n 'thoughtspot': 7,\n 'anyscale': 7,\n 'replicate': 7,\n 'together-ai': 7,\n 'fireworks-ai': 7,\n 'runpod': 7,\n 'lambda-labs': 7,\n 'vast-ai': 7,\n 'paperspace': 7,\n 'coreweave': 7,\n 'modal': 7,\n 'cerebras': 7,\n 'openrouter': 7,\n 'jan-ai': 7,\n 'lm-studio': 7,\n 'ollama': 7,\n 'open-webui': 7,\n 'anythingllm': 7,\n 'pinecone': 7,\n 'wandb-weave': 7,\n 'weights-biases': 7,\n 'agentops': 7,\n 'eraser': 7,\n 'mintlify': 7,\n 'swimm': 7,\n 'stepsize': 7,\n 'semgrep': 7,\n 'snyk-ai': 7,\n 'codiga': 7,\n 'gitlens-ai': 7,\n 'pieces-for-developers': 7,\n 'coderabbit': 7,\n 'warp': 7,\n 'fly-io': 7,\n 'netlify': 7,\n 'railway': 7,\n 'supabase-ai': 7,\n 'vercel-ai': 7,\n 'locofy-ai': 7,\n 'anima': 7,\n 'galileo-ai': 7,\n 'uizard': 7,\n 'visily': 7,\n 'penpot': 7,\n 'invision': 7,\n 'sketch': 7,\n 'khroma': 7,\n 'microsoft-designer': 7,\n 'whimsical-ai': 7,\n 'lucidchart-ai': 7,\n 'infogram': 7,\n 'piktochart': 7,\n 'venngage': 7,\n 'brandmark': 7,\n 'looka': 7,\n 'hatchful': 7,\n 'logo-ai': 7,\n 'framer': 7,\n 'durable': 7,\n 'wix-adi': 7,\n '10web': 7,\n 'bubble-app': 7,\n 'softr': 7,\n 'glide': 7,\n 'flutterflow': 7,\n 'retool-ai': 7,\n 'appsheet': 7,\n 'adalo': 7,\n 'plasmic': 7,\n 'dora': 7,\n 'webflow': 7,\n 'airtable': 7,\n 'notion': 7,\n 'coda-ai': 7,\n 'miro-ai': 7,\n 'nuance-dax': 7,\n 'doximity': 7,\n 'ada-health': 7,\n 'babylon-health': 7,\n 'buoy-health': 7,\n 'k-health': 7,\n 'infermedica': 7,\n 'navina': 7,\n 'aidoc-ai': 7,\n 'lunit': 7,\n 'tempus-ai': 7,\n 'benevolentai': 7,\n 'insilico-medicine': 7,\n 'alphafold-ai': 7,\n 'paige-ai': 7,\n 'suki-ai': 7,\n 'abridge-ai': 7,\n 'ada': 7,\n 'planner-5d': 7,\n 'homestyler': 7,\n 'houzz': 7,\n 'sketchup': 7,\n 'finch3d': 7,\n 'testfit': 7,\n 'spacemaker-ai': 7,\n 'climate-fieldview': 7,\n 'john-deere': 7,\n 'farmlogs': 7,\n 'granular': 7,\n 'fashwell': 7,\n 'stitch-fix': 7,\n 'the-yes': 7,\n 'vue-ai': 7,\n 'plantnet': 7,\n 'sidechef': 7,\n 'whisk': 7,\n 'yuka': 7,\n 'charisma-ai': 7,\n 'inworld-ai': 7,\n 'scenario': 7,\n 'ludo-ai': 7,\n 'promethean-ai': 7,\n 'ai-dungeon': 7,\n 'buzzsprout': 7,\n 'spotify-podcasters': 7,\n 'descript-podcast': 7,\n 'transistor': 7,\n 'chai': 7,\n 'kindroid': 7,\n 'pi-ai': 7,\n 'alexa-ai': 7,\n 'compress-ai': 7,\n 'gamma': 7,\n 'content-at-scale': 7,\n 'article-forge': 7,\n 'longshot-ai': 7,\n 'koala-ai': 7,\n 'narrato': 7,\n 'writerly': 7,\n 'ink-editor': 7,\n 'chibi-ai': 7,\n 'rytr': 7,\n 'scalenut': 7,\n 'sassbook-ai': 7,\n 'ai-writer': 7,\n 'wordai': 7,\n 'wordsmith': 7,\n 'novelai': 7,\n 'sudowrite': 7,\n 'jenni-ai': 7,\n 'lex': 7,\n 'hemingway-editor': 7,\n 'prowritingaid': 7,\n 'languagetool': 7,\n 'textio': 7,\n 'originality-ai': 7,\n 'openai-canvas': 7,\n 'copy-ai-writing': 7,\n 'jasper-copy': 7,\n 'peppertype-ai': 7,\n 'hypotenuse-ai': 7,\n 'anyword': 7,\n 'writesonic-copy': 7,\n 'growthbar': 7,\n 'moz-pro': 7,\n 'neuraltext': 7,\n 'frase': 7,\n 'alli-ai': 7,\n 'marketmuse': 7,\n 'unbounce-ai': 7,\n 'crayon': 7,\n 'persado': 7,\n 'jasper-marketing': 7,\n 'rippling': 7,\n 'adp': 7,\n 'bamboohr': 7,\n 'workday': 7,\n 'personio': 7,\n 'factorial': 7,\n 'hibob': 7,\n 'charliehr': 7,\n 'betterworks': 7,\n 'leapsome': 7,\n 'lattice-ai': 7,\n 'culture-amp': 7,\n 'eightfold-ai': 7,\n 'hirevue': 7,\n '15five-ai': 7,\n 'expensify': 7,\n 'bill-ai': 7,\n 'botkeeper': 7,\n 'pilot': 7,\n 'zeni': 7,\n 'causal': 7,\n 'mosaic': 7,\n 'ramp': 7,\n 'tipalti': 7,\n 'stampli': 7,\n 'yodlee': 7,\n 'plaid': 7,\n 'kensho': 7,\n 'pitchbook': 7,\n 'docusign-ai': 7,\n 'pandadoc-ai': 7,\n 'proposify': 7,\n 'qwilr': 7,\n 'salesforce-einstein': 7,\n 'zoho': 7,\n 'servicenow': 7,\n 'aws-govcloud': 7,\n 'palantir-gotham': 7,\n 'ibm-watson-government': 7,\n 'microsoft-government-cloud': 7,\n 'redfin': 7,\n 'zillow': 7,\n 'compass': 7,\n 'opendoor': 7,\n 'bigcommerce': 7,\n 'magento': 7,\n 'woocommerce': 7,\n 'dynamic-yield': 7,\n 'nosto': 7,\n 'okendo': 7,\n 'yotpo': 7,\n 'stamped-io': 7,\n 'recharge': 7,\n 'privy': 7,\n 'formula-bot': 7,\n 'ajelix': 7,\n 'sheet-plus': 7,\n 'numerous': 7,\n 'blue-yonder': 7,\n 'sap-ariba': 7,\n 'llamasoft': 7,\n 'oracle-scm': 7,\n 'dark-sky': 7,\n 'tomorrow-io': 7,\n 'weather-ai': 7,\n 'weatherbug': 7,\n 'contentstudio': 7,\n 'metricool': 7,\n 'later': 7,\n 'missinglettr': 7,\n 'socialbee': 7,\n 'predis-ai': 7,\n 'typefully': 7,\n 'taplio': 7,\n 'flick-ai': 7,\n 'aiprm': 7,\n 'poe': 7,\n 'gemini-advanced': 7,\n 'mistral-le-chat': 7,\n 'kimi': 7,\n 'venice-ai': 7,\n '01-ai': 7,\n 'aleph-alpha': 7,\n 'qwen': 7,\n 'together-ai-models': 7,\n 'amplenote': 7,\n 'raycast-ai': 7,\n 'reclaim-ai': 7,\n 'compose-ai': 7,\n 'loom': 7,\n 'synthesia-video': 7,\n 'biteable': 7,\n 'fliki': 7,\n 'moovly': 7,\n 'raw-shorts': 7,\n 'renderforest': 7,\n 'simpleshow': 7,\n 'steve-ai': 7,\n 'stable-video-diffusion': 7,\n 'hailuo-ai': 7,\n 'haiper': 7,\n 'dolby-io': 7,\n 'izotope-rx': 7,\n 'auphonic': 7,\n 'cleanfeed': 7,\n 'landr': 7,\n 'theaudiostuff': 7,\n 'adobe-enhance-speech': 7,\n 'descript-studio-sound': 7,\n 'eleven-labs-sound-effects': 7,\n 'lokalise-ai': 7,\n 'phrase': 7,\n 'microsoft-translator': 7,\n 'reverso': 7,\n 'deepl': 7,\n 'altern': 7,\n 'ai-for-developer': 7,\n 'aidir-wiki': 7,\n 'productivity-directory': 7,\n 'aisera': 7,\n '6sense-ai': 7,\n 'moovly': 7,\n 'ace-studio': 7,\n 'abbyy': 7,\n 'weglot': 7,\n 'transifex': 7,\n 'crowdin': 7,\n 'bambu-studio': 7,\n 'prusaslicer': 7,\n 'ultimaker-cura': 7,\n 'accessibe': 7,\n 'naturalreader': 7,\n 'be-my-eyes': 7,\n 'rapidapi': 7,\n 'insomnia': 7,\n '8th-wall': 7,\n 'niantic-lightship': 7,\n 'meta-quest': 7,\n 'agiloft': 7,\n 'landing-ai': 7,\n 'hive-moderation': 7,\n 'perspective-api': 7,\n 'azure-content-moderator': 7,\n 'sight-machine': 7,\n 'augury': 7,\n 'tulip': 7,\n 'stem-ai': 7,\n 'uplight': 7,\n 'hopin': 7,\n 'transifex': 7,\n 'mercury': 7,\n 'brex': 7,\n 'freeletics': 7,\n 'kinedu': 7,\n 'homer-learning': 7,\n 'tinybeans': 7,\n 'iplytics': 7,\n 'derwent-innovation': 7,\n 'petcube': 7,\n 'whistle-pets': 7,\n 'transcend-privacy': 7,\n 'promptbase': 7,\n 'prompthero': 7,\n 'flowgpt': 7,\n 'blinkist': 7,\n 'audible': 7,\n 'readwise': 7,\n 'storychief': 7,\n 'shorthand': 7,\n 'storybird': 7,\n 'moralis': 7,\n 'dune-analytics': 7,\n 'amwell': 7,\n 'mermaid-chart': 7,\n 'archbee': 7,\n 'rookie': 7,\n 'particle-iot': 7,\n 'aws-iot': 7,\n 'azure-iot': 7,\n 'samsara': 7,\n 'geotab': 7,\n 'buildxact': 7,\n 'spot-io': 7,\n 'vanta': 7,\n 'drata': 7,\n 'smartrecruiters': 7,\n 'formant': 7,\n 'satellogic': 7,\n 'lexalytics': 7,\n 'repustate': 7,\n 'virtuous': 7,\n 'adiprm': 7,\n 'rookout': 7,\n 'coggle': 7,\n 'mybillbook': 7,\n}\n\nDEFAULT_RANK = 5\n\n\ndef get_rank(slug):\n return RANKS.get(slug, DEFAULT_RANK)\n\n\ndef process_file(path):\n with open(path, 'r', encoding='utf-8') as f:\n content = f.read()\n\n m = re.match(r'^(---\\n)(.*?)(---\\n)', content, re.S)\n if not m:\n return False\n\n fm = m.group(2)\n slug_m = re.search(r\"^slug:\\s*'?([^'\\n]+)'?\", fm, re.M)\n if not slug_m:\n return False\n\n slug = slug_m.group(1).strip().strip(\"'\")\n rank = get_rank(slug)\n\n # Remove existing rank line\n fm_lines = [l for l in fm.split('\\n') if not l.startswith('rank:')]\n fm = '\\n'.join(fm_lines)\n if not fm.endswith('\\n'):\n fm += '\\n'\n\n # Insert rank after 'featured:' line\n lines = fm.split('\\n')\n new_lines = []\n inserted = False\n for line in lines:\n new_lines.append(line)\n if line.startswith('featured:') and not inserted:\n new_lines.append(f'rank: {rank}')\n inserted = True\n if not inserted:\n new_lines.append(f'rank: {rank}')\n\n new_fm = '\\n'.join(new_lines)\n new_content = m.group(1) + new_fm + m.group(3) + content[m.end():]\n\n with open(path, 'w', encoding='utf-8') as f:\n f.write(new_content)\n return True\n\n\ndef main():\n files = sorted(f for f in os.listdir(TOOLS_DIR) if f.endswith('.md'))\n updated = 0\n rank_counts = {}\n for fname in files:\n slug = fname[:-3]\n rank = get_rank(slug)\n rank_counts[rank] = rank_counts.get(rank, 0) + 1\n path = os.path.join(TOOLS_DIR, fname)\n if process_file(path):\n updated += 1\n\n print(f'Updated {updated}/{len(files)} files.')\n print('Rank distribution:')\n for r in sorted(rank_counts, reverse=True):\n print(f' Rank {r}: {rank_counts[r]} tools')\n\n\nif __name__ == '__main__':\n main()\n"}}}}