{"openapi":"3.1.0","info":{"title":"vibecheck","description":"AI tools intelligence - curated evaluations with API access","version":"0.1.0"},"paths":{"/":{"get":{"summary":"Root","description":"Root endpoint with API info.","operationId":"root__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/tools":{"get":{"summary":"Tools List","description":"Tools listing page.","operationId":"tools_list_tools_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/tools/{slug}":{"get":{"summary":"Tool Detail","description":"Tool detail page. Use ?format=md for markdown.","operationId":"tool_detail_tools__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/articles":{"get":{"summary":"Articles List","description":"Articles listing page. Use ?format=md for markdown.","operationId":"articles_list_articles_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/bookmarks":{"get":{"summary":"Bookmarks Page","description":"Bookmarks page - items are stored in localStorage and rendered client-side.","operationId":"bookmarks_page_bookmarks_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/discover":{"get":{"summary":"Discover Page","description":"Tinder-like swipe interface for discovering tools and articles.","operationId":"discover_page_discover_get","parameters":[{"name":"mode","in":"query","required":false,"schema":{"type":"string","pattern":"^(tools|articles|mixed)$","default":"mixed","title":"Mode"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/communities":{"get":{"summary":"Communities List","description":"Communities listing page.","operationId":"communities_list_communities_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/communities/{slug}":{"get":{"summary":"Community Detail","description":"Community detail page.","operationId":"community_detail_communities__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/docs":{"get":{"summary":"Docs Page","description":"API documentation page. Use ?format=md for markdown.","operationId":"docs_page_docs_get","parameters":[{"name":"format","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Format"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/login":{"get":{"summary":"Login Page","description":"Show login page.","operationId":"login_page_admin_login_get","parameters":[{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Login","description":"Process login.","operationId":"login_admin_login_post","requestBody":{"required":true,"content":{"application/x-www-form-urlencoded":{"schema":{"$ref":"#/components/schemas/Body_login_admin_login_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/logout":{"get":{"summary":"Logout","description":"Log out admin.","operationId":"logout_admin_logout_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin":{"get":{"summary":"Admin Dashboard","description":"Admin dashboard.","operationId":"admin_dashboard_admin_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/admin/tools":{"get":{"summary":"Admin Tools List","description":"List tools for admin.","operationId":"admin_tools_list_admin_tools_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tools/new":{"get":{"summary":"Admin Tool New","description":"New tool form.","operationId":"admin_tool_new_admin_tools_new_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/admin/tools/{slug}/edit":{"get":{"summary":"Admin Tool Edit","description":"Edit tool form.","operationId":"admin_tool_edit_admin_tools__slug__edit_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/tools/save":{"post":{"summary":"Admin Tool Save","description":"Save tool (create or update).","operationId":"admin_tool_save_admin_tools_save_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/tools/{slug}/delete":{"post":{"summary":"Admin Tool Delete","description":"Delete a tool.","operationId":"admin_tool_delete_admin_tools__slug__delete_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/articles":{"get":{"summary":"Admin Articles List","description":"List articles for admin.","operationId":"admin_articles_list_admin_articles_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Search"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/articles/new":{"get":{"summary":"Admin Article New","description":"New article form.","operationId":"admin_article_new_admin_articles_new_get","responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/admin/articles/{slug}/edit":{"get":{"summary":"Admin Article Edit","description":"Edit article form.","operationId":"admin_article_edit_admin_articles__slug__edit_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/articles/save":{"post":{"summary":"Admin Article Save","description":"Save article (create or update).","operationId":"admin_article_save_admin_articles_save_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/admin/articles/{slug}/delete":{"post":{"summary":"Admin Article Delete","description":"Delete an article.","operationId":"admin_article_delete_admin_articles__slug__delete_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/admin/debug-env":{"get":{"summary":"Debug Env","description":"Debug endpoint to check env vars (remove in production).","operationId":"debug_env_admin_debug_env_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health","description":"Health check endpoint.","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/api/v1/tools":{"get":{"summary":"List Tools","description":"List all tools with pagination and filtering.","operationId":"list_tools_api_v1_tools_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Per Page"}},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"}},{"name":"sort_by","in":"query","required":false,"schema":{"type":"string","pattern":"^(github_stars|name|created_at|updated_at)$","default":"github_stars","title":"Sort By"}},{"name":"sort_order","in":"query","required":false,"schema":{"type":"string","pattern":"^(asc|desc)$","default":"desc","title":"Sort Order"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Tool","description":"Create a new tool. Requires authentication.","operationId":"create_tool_api_v1_tools_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tools/{slug}":{"get":{"summary":"Get Tool","description":"Get a tool by slug with all evaluations and links.","operationId":"get_tool_api_v1_tools__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolDetailResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Update Tool","description":"Update a tool. Uses admin client to bypass RLS.","operationId":"update_tool_api_v1_tools__slug__patch","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tools/{slug}/evaluations":{"post":{"summary":"Create Evaluation","description":"Add or update an evaluation for a tool. Requires authentication.","operationId":"create_evaluation_api_v1_tools__slug__evaluations_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EvaluationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tools/{slug}/links":{"post":{"summary":"Create Link","description":"Add an external link to a tool. Requires authentication.","operationId":"create_link_api_v1_tools__slug__links_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/categories":{"get":{"summary":"List Categories","description":"List all categories with tool counts.","operationId":"list_categories_api_v1_categories_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CategoryResponse"},"type":"array","title":"Response List Categories Api V1 Categories Get"}}}}}}},"/api/v1/search":{"get":{"summary":"Search Tools","description":"Search tools by name, description, or slug.","operationId":"search_tools_api_v1_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":100,"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot/tool/{slug}":{"get":{"summary":"Bot Get Tool","description":"Simplified tool info optimized for bot/agent consumption.\nReturns a flat structure with key metrics.","operationId":"bot_get_tool_api_v1_bot_tool__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bot/recommend":{"get":{"summary":"Bot Recommend","description":"Get tool recommendations for a use case.\nBot-friendly endpoint for agents to find tools.","operationId":"bot_recommend_api_v1_bot_recommend_get","parameters":[{"name":"use_case","in":"query","required":true,"schema":{"type":"string","description":"What you want to do (e.g., 'code review', 'agent framework')","title":"Use Case"},"description":"What you want to do (e.g., 'code review', 'agent framework')"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"default":5,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/communities":{"get":{"summary":"List Communities","description":"List all communities with tool counts.","operationId":"list_communities_api_v1_communities_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/CommunityResponse"},"type":"array","title":"Response List Communities Api V1 Communities Get"}}}}}}},"/api/v1/communities/{slug}":{"get":{"summary":"Get Community","description":"Get a community with its tools.","operationId":"get_community_api_v1_communities__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/communities/{slug}/tools":{"get":{"summary":"Get Community Tools","description":"Get tools discussed in a community.","operationId":"get_community_tools_api_v1_communities__slug__tools_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Per Page"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/mentions":{"get":{"summary":"Get Mentions","description":"Get mention history with timestamps.\n\nEach mention records when a tool was discussed in a community.","operationId":"get_mentions_api_v1_mentions_get","parameters":[{"name":"tool","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by tool slug","title":"Tool"},"description":"Filter by tool slug"},{"name":"community","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by community slug","title":"Community"},"description":"Filter by community slug"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ToolMentionResponse"},"title":"Response Get Mentions Api V1 Mentions Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tools/{slug}/mentions":{"get":{"summary":"Get Tool Mentions","description":"Get all mentions of a specific tool with timestamps.","operationId":"get_tool_mentions_api_v1_tools__slug__mentions_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"community","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter by community","title":"Community"},"description":"Filter by community"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/communities/{slug}/mentions":{"get":{"summary":"Get Community Mentions","description":"Get recent tool mentions in a community with timestamps.","operationId":"get_community_mentions_api_v1_communities__slug__mentions_get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ingest":{"post":{"summary":"Ingest Tool Mention","description":"Ingest a single tool mention from external system (ai-wiki, etc.).\n\nIf tool doesn't exist, creates it. Records the mention with timestamp.","operationId":"ingest_tool_mention_api_v1_ingest_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookToolMention"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ingest/batch":{"post":{"summary":"Ingest Batch","description":"Batch ingest multiple tool mentions.\n\nUseful for importing from chat exports or syncing from ai-wiki.","operationId":"ingest_batch_api_v1_ingest_batch_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookBatchIngest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebhookResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/articles":{"get":{"summary":"List Articles","description":"List articles about vibe coding, AI tools, and related topics.","operationId":"list_articles_api_v1_articles_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Per Page"}},{"name":"community","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Community"}},{"name":"tag","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tag"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArticleListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Article","description":"Add a new article about vibe coding / AI tools.","operationId":"create_article_api_v1_articles_post","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArticleCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArticleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/articles/recent":{"get":{"summary":"Recent Articles","description":"Get most recently discovered articles.","operationId":"recent_articles_api_v1_articles_recent_get","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"default":10,"title":"Limit"}},{"name":"community","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Community"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/articles/search":{"get":{"summary":"Search Articles","description":"Search articles by title or summary.","operationId":"search_articles_api_v1_articles_search_get","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"title":"Q"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/articles/{slug}":{"get":{"summary":"Get Article","description":"Get article details by slug.","operationId":"get_article_api_v1_articles__slug__get","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArticleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"summary":"Update Article","description":"Update an article's metadata (title, summary, tags).","operationId":"update_article_api_v1_articles__slug__patch","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}},{"name":"title","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"}},{"name":"summary","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"title":"Tags"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/articles/{slug}/upvote":{"post":{"summary":"Upvote Article","description":"Upvote an article (swipe right).","operationId":"upvote_article_api_v1_articles__slug__upvote_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/articles/{slug}/downvote":{"post":{"summary":"Downvote Article","description":"Downvote an article (swipe left).","operationId":"downvote_article_api_v1_articles__slug__downvote_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tools/{slug}/upvote":{"post":{"summary":"Upvote Tool","description":"Upvote a tool (swipe right).","operationId":"upvote_tool_api_v1_tools__slug__upvote_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/tools/{slug}/downvote":{"post":{"summary":"Downvote Tool","description":"Downvote a tool (swipe left).","operationId":"downvote_tool_api_v1_tools__slug__downvote_post","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","title":"Slug"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"ArticleCreate":{"properties":{"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url"},"title":{"type":"string","maxLength":500,"minLength":1,"title":"Title"},"author":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"summary":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Summary"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"community_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Community Slug"},"mentioned_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mentioned By"},"source":{"type":"string","title":"Source","default":"manual"}},"type":"object","required":["url","title"],"title":"ArticleCreate","description":"Create a new article."},"ArticleListResponse":{"properties":{"articles":{"items":{"$ref":"#/components/schemas/ArticleResponse"},"type":"array","title":"Articles"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"per_page":{"type":"integer","title":"Per Page"},"has_more":{"type":"boolean","title":"Has More"}},"type":"object","required":["articles","total","page","per_page","has_more"],"title":"ArticleListResponse","description":"Paginated list of articles."},"ArticleResponse":{"properties":{"id":{"type":"string","title":"Id"},"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"url":{"type":"string","title":"Url"},"author":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Author"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"discovered_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Discovered At"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"community":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Community"},"community_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Community Name"},"mentioned_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mentioned By"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"upvotes":{"type":"integer","title":"Upvotes","default":0}},"type":"object","required":["id","slug","title","url"],"title":"ArticleResponse","description":"Article response."},"Body_login_admin_login_post":{"properties":{"password":{"type":"string","title":"Password"}},"type":"object","required":["password"],"title":"Body_login_admin_login_post"},"CategoryResponse":{"properties":{"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"tool_count":{"type":"integer","title":"Tool Count","default":0}},"type":"object","required":["slug","name"],"title":"CategoryResponse","description":"Category info."},"CommunityResponse":{"properties":{"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"tool_count":{"type":"integer","title":"Tool Count","default":0}},"type":"object","required":["slug","name"],"title":"CommunityResponse","description":"Community where tools are discussed."},"EvaluationCreate":{"properties":{"works":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Works"},"actively_maintained":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Actively Maintained"},"verdict":{"anyOf":[{"$ref":"#/components/schemas/Verdict"},{"type":"null"}]},"security_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Security Notes"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"communities":{"items":{"type":"string"},"type":"array","title":"Communities"}},"type":"object","title":"EvaluationCreate","description":"Submit an evaluation for a tool."},"EvaluationResponse":{"properties":{"id":{"type":"string","title":"Id"},"works":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Works"},"actively_maintained":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Actively Maintained"},"verdict":{"anyOf":[{"$ref":"#/components/schemas/Verdict"},{"type":"null"}]},"security_notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Security Notes"},"notes":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notes"},"communities":{"items":{"type":"string"},"type":"array","title":"Communities","default":[]},"evaluator":{"anyOf":[{"$ref":"#/components/schemas/UserResponse"},{"type":"null"}]},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","created_at","updated_at"],"title":"EvaluationResponse","description":"Evaluation with evaluator info."},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"LinkCreate":{"properties":{"url":{"type":"string","maxLength":2083,"minLength":1,"format":"uri","title":"Url"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"link_type":{"$ref":"#/components/schemas/LinkType","default":"other"},"snippet":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Snippet"}},"type":"object","required":["url"],"title":"LinkCreate","description":"Add an external link to a tool."},"LinkResponse":{"properties":{"id":{"type":"string","title":"Id"},"url":{"type":"string","title":"Url"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"link_type":{"$ref":"#/components/schemas/LinkType"},"snippet":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Snippet"},"submitted_by":{"anyOf":[{"$ref":"#/components/schemas/UserResponse"},{"type":"null"}]},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","url","link_type","created_at"],"title":"LinkResponse","description":"External link response."},"LinkType":{"type":"string","enum":["blog","video","discussion","docs","tutorial","review","other"],"title":"LinkType","description":"Types of external links."},"SearchResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/SearchResult"},"type":"array","title":"Results"},"query":{"type":"string","title":"Query"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["results","query","total"],"title":"SearchResponse","description":"Search results."},"SearchResult":{"properties":{"tool":{"$ref":"#/components/schemas/ToolResponse"},"relevance":{"type":"number","title":"Relevance","default":1.0},"matched_fields":{"items":{"type":"string"},"type":"array","title":"Matched Fields","default":[]}},"type":"object","required":["tool"],"title":"SearchResult","description":"Search result with relevance."},"Sentiment":{"type":"string","enum":["positive","negative","neutral","question"],"title":"Sentiment","description":"Sentiment of tool mentions."},"ToolCommunityResponse":{"properties":{"community":{"$ref":"#/components/schemas/CommunityResponse"},"first_mentioned":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Mentioned"},"mention_count":{"type":"integer","title":"Mention Count","default":0},"sentiment_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sentiment Summary"}},"type":"object","required":["community"],"title":"ToolCommunityResponse","description":"Tool's presence in a community."},"ToolCreate":{"properties":{"slug":{"type":"string","maxLength":100,"minLength":2,"pattern":"^[a-z0-9-]+$","title":"Slug"},"name":{"type":"string","maxLength":200,"minLength":1,"title":"Name"},"url":{"anyOf":[{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},{"type":"null"}],"title":"Url"},"github_url":{"anyOf":[{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},{"type":"null"}],"title":"Github Url"},"categories":{"items":{"type":"string"},"type":"array","title":"Categories"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","required":["slug","name"],"title":"ToolCreate","description":"Create a new tool."},"ToolDetailResponse":{"properties":{"id":{"type":"string","title":"Id"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"github_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Github Url"},"categories":{"items":{"type":"string"},"type":"array","title":"Categories","default":[]},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"github_stars":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Github Stars"},"github_last_commit":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Github Last Commit"},"github_open_issues":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Github Open Issues"},"github_license":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Github License"},"communities":{"items":{"type":"string"},"type":"array","title":"Communities","default":[]},"first_seen":{"type":"string","format":"date-time","title":"First Seen"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"evaluations":{"items":{"$ref":"#/components/schemas/EvaluationResponse"},"type":"array","title":"Evaluations","default":[]},"links":{"items":{"$ref":"#/components/schemas/LinkResponse"},"type":"array","title":"Links","default":[]},"community_details":{"items":{"$ref":"#/components/schemas/ToolCommunityResponse"},"type":"array","title":"Community Details","default":[]},"mention_count":{"type":"integer","title":"Mention Count","default":0},"avg_verdict":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avg Verdict"},"works_count":{"type":"integer","title":"Works Count","default":0},"works_total":{"type":"integer","title":"Works Total","default":0}},"type":"object","required":["id","slug","name","first_seen","created_at","updated_at"],"title":"ToolDetailResponse","description":"Tool with evaluations and links."},"ToolListResponse":{"properties":{"tools":{"items":{"$ref":"#/components/schemas/ToolResponse"},"type":"array","title":"Tools"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"per_page":{"type":"integer","title":"Per Page"},"has_more":{"type":"boolean","title":"Has More"}},"type":"object","required":["tools","total","page","per_page","has_more"],"title":"ToolListResponse","description":"Paginated list of tools."},"ToolMentionResponse":{"properties":{"id":{"type":"string","title":"Id"},"tool_slug":{"type":"string","title":"Tool Slug"},"tool_name":{"type":"string","title":"Tool Name"},"community_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Community Slug"},"community_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Community Name"},"mentioned_at":{"type":"string","format":"date-time","title":"Mentioned At"},"context_snippet":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Context Snippet"},"sentiment":{"anyOf":[{"$ref":"#/components/schemas/Sentiment"},{"type":"null"}]}},"type":"object","required":["id","tool_slug","tool_name","mentioned_at"],"title":"ToolMentionResponse","description":"A tool mention with full context."},"ToolResponse":{"properties":{"id":{"type":"string","title":"Id"},"slug":{"type":"string","title":"Slug"},"name":{"type":"string","title":"Name"},"url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Url"},"github_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Github Url"},"categories":{"items":{"type":"string"},"type":"array","title":"Categories","default":[]},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"github_stars":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Github Stars"},"github_last_commit":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Github Last Commit"},"github_open_issues":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Github Open Issues"},"github_license":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Github License"},"communities":{"items":{"type":"string"},"type":"array","title":"Communities","default":[]},"first_seen":{"type":"string","format":"date-time","title":"First Seen"},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","slug","name","first_seen","created_at","updated_at"],"title":"ToolResponse","description":"Tool with all related data."},"ToolUpdate":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"url":{"anyOf":[{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},{"type":"null"}],"title":"Url"},"github_url":{"anyOf":[{"type":"string","maxLength":2083,"minLength":1,"format":"uri"},{"type":"null"}],"title":"Github Url"},"categories":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Categories"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"}},"type":"object","title":"ToolUpdate","description":"Update an existing tool."},"UserResponse":{"properties":{"id":{"type":"string","title":"Id"},"github_username":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Github Username"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"avatar_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Avatar Url"}},"type":"object","required":["id"],"title":"UserResponse","description":"Public user info for attribution."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"Verdict":{"type":"string","enum":["essential","solid","situational","caution","avoid"],"title":"Verdict","description":"Tool evaluation verdicts."},"WebhookBatchIngest":{"properties":{"mentions":{"items":{"$ref":"#/components/schemas/WebhookToolMention"},"type":"array","title":"Mentions"},"source":{"type":"string","title":"Source","default":"webhook"},"deduplicate":{"type":"boolean","title":"Deduplicate","default":true}},"type":"object","required":["mentions"],"title":"WebhookBatchIngest","description":"Batch ingest multiple tool mentions."},"WebhookResponse":{"properties":{"received":{"type":"integer","title":"Received"},"created":{"type":"integer","title":"Created"},"updated":{"type":"integer","title":"Updated"},"skipped":{"type":"integer","title":"Skipped"},"errors":{"items":{"type":"string"},"type":"array","title":"Errors"}},"type":"object","required":["received","created","updated","skipped"],"title":"WebhookResponse","description":"Response from webhook ingestion."},"WebhookToolMention":{"properties":{"tool_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool Slug"},"tool_name":{"type":"string","title":"Tool Name"},"tool_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool Url"},"github_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Github Url"},"community":{"type":"string","title":"Community"},"mentioned_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Mentioned At"},"context_snippet":{"anyOf":[{"type":"string","maxLength":1000},{"type":"null"}],"title":"Context Snippet"},"sentiment":{"anyOf":[{"$ref":"#/components/schemas/Sentiment"},{"type":"null"}]},"source":{"type":"string","title":"Source","default":"webhook"},"source_doc_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Doc Id"},"source_doc_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Doc Url"}},"type":"object","required":["tool_name","community"],"title":"WebhookToolMention","description":"Incoming tool mention from external system (ai-wiki, etc.)."}}}}