[{"data":1,"prerenderedAt":437},["ShallowReactive",2],{"project-43445720":3},{"id":4,"name":5,"line":6,"line_source":7,"title":8,"url":9,"domain":10,"maker":11,"posted_at":12,"year":13,"points":14,"comments":15,"rank_in_year":16,"shown_in_year":17,"top":18,"tier":19,"category":20,"subcategory":21,"format":22,"keywords":23,"reception":29,"sentiment":30,"stance_mix":31,"scored_comments":36,"aspects":37,"strip":45,"post_text":47,"what":48,"said":88,"maker_in_thread":191,"shape":201,"grid":204,"attempts":399,"same_week":400,"maker_shows":246,"maker_hidden":429,"reader_version":430,"card":431},"43445720","FastOpenAPI","automated docs for many Python frameworks","title","Show HN: FastOpenAPI – automated docs for many Python frameworks","https:\u002F\u002Fgithub.com\u002Fmr-fatalyst\u002Ffastopenapi","github.com","mr_Fatalyst",1742652630,2025,153,77,478,3837,13,"notable","dev_tools","api documentation library","library",[24,25,26,27,28],"openapi","python","fastapi","flask","api documentation","mixed",0.167,{"positive":32,"neutral":33,"mixed":34,"critical":35},7,11,1,4,23,{"design":38,"idea":40,"execution":42,"docs":43,"performance":44},{"positive":35,"critical":39},0,{"positive":39,"critical":41},3,{"positive":39,"critical":39},{"positive":34,"critical":39},{"positive":39,"critical":34},[39,46,41,41,39,41,39,41,34,39,39,39,46,39,41,46,46,39,39,39,39,39,46,39,39,39,39,39,39,41,39,41,39,34,34,39,34,39,41,46],5,null,{"problem":49,"audience":56,"pricing":47,"motivation":60,"time_to_build":47,"stack":64,"openness":85,"stage":86,"team_size":87},{"value":50,"source":51,"evidence":52},"Maintaining OpenAPI docs across multiple Python frameworks with separate solutions","maker",[53],{"id":54,"by":11,"text":55},"43445726","Hey everyone! While working on a project that required OpenAPI docs across multiple frameworks, I got tired of maintaining separate solutions. I liked FastAPI’s clean and…",{"value":57,"source":51,"evidence":58},"Developers who prefer FastAPI-style routing but need to use a different Python framework",[59],{"id":54,"by":11,"text":55},{"value":61,"source":51,"evidence":62},"Tired of maintaining separate OpenAPI solutions across projects using multiple frameworks",[63],{"id":54,"by":11,"text":55},[65,69,75,81],{"value":66,"source":51,"evidence":67},"Python",[68],{"id":54,"by":11,"text":55},{"value":70,"source":51,"evidence":71},"Pydantic",[72],{"id":73,"by":11,"text":74},"43449091","Glad you like the idea! Actually, returning a Pydantic model directly isn't mandatory—it's just a recommended and convenient approach to ensure automatic data validation and…",{"value":76,"source":51,"evidence":77},"Swagger UI",[78],{"id":79,"by":11,"text":80},"43445951","Thanks a lot! Glad to hear it fits your needs. For a clean, documentation UI, the best open-source options right now are probably Swagger UI and ReDoc. FastOpenAPI uses both by…",{"value":82,"source":51,"evidence":83},"ReDoc",[84],{"id":79,"by":11,"text":80},"open_source","beta","unknown",{"praise":89,"objections":117,"requests":126,"questions":149,"alternatives":160},[90,106],{"value":91,"source":92,"evidence":93},"Clean, seamless FastAPI-style decorator and router design for Flask","commenter",[94,98,102],{"id":95,"by":96,"text":97},"43445887","memset","This is really cool - something I've been looking for with Flask. Cleanest implementation with just the decorator that I've seen. (As an aside, is there an open-source UI for…",{"id":99,"by":100,"text":101},"43452402","odie5533","Awesome project! It looks so seamless for Flask! Just switch routers, and you model deserialization\u002Fserialization, and \u002Fdocs. Really impressive work! Is there any way to not need…",{"id":103,"by":104,"text":105},"43445988","asabla","for someone that comes primarily from a .net background. This looks fantastic! Just one thing that I tried to find more information about is: are you suppose to rely on the…",{"value":107,"source":92,"evidence":108},"Fills a long-standing gap for docs in Flask and other frameworks",[109,113],{"id":110,"by":111,"text":112},"43448689","These335","Love Flask, but this has always been a missing tool. I have a question though - it seems like you're actually modifying the response data type for Flask routes so that it's a…",{"id":114,"by":115,"text":116},"43450754","Everdred2dx","Nice. This was one of the main shortcomings in Falcon that pushed me to switch some projects to FastAPI. That said FastAPI had many other benefits that went far beyond API specs.",[118,122],{"value":119,"source":92,"evidence":120},"Requires returning Pydantic models for best docs, a big ask for existing APIs",[121],{"id":110,"by":111,"text":112},{"value":123,"source":92,"evidence":124},"Response model must be specified explicitly rather than inferred from return type",[125],{"id":99,"by":100,"text":101},[127,138,142],{"value":128,"source":92,"evidence":129},"Django or DRF support",[130,134],{"id":131,"by":132,"text":133},"43446204","Onavo","No love for Django? I am looking for an alternative to DRF and Django-ninja that can optionally generate typed APIs and docs directly from the model definitions.",{"id":135,"by":136,"text":137},"43454984","raylad","Why no Django?",{"value":139,"source":92,"evidence":140},"Automatic response type inference",[141],{"id":99,"by":100,"text":101},{"value":143,"source":92,"evidence":144},"Streaming or chunked response documentation",[145],{"id":146,"by":147,"text":148},"43449515","pamelafox","And would it document a streaming API? (With transfer-encoding: chunked) The support for that in OpenAPI is still in progress, I believe.",[150,156],{"value":151,"source":92,"evidence":152},"Does the Flask extra also support Quart?",[153],{"id":154,"by":147,"text":155},"43449504","Does the flask extra also support quart?",{"value":157,"source":92,"evidence":158},"How should API versioning be handled with prefixes?",[159],{"id":103,"by":104,"text":105},[161,169,176,183],{"value":162,"source":92,"evidence":163},"Django Ninja",[164,165],{"id":131,"by":132,"text":133},{"id":166,"by":167,"text":168},"43446633","ensignavenger","Django Ninja provides this already for Django, and it is great.",{"value":170,"source":92,"evidence":171},"DRF-spectacular",[172],{"id":173,"by":174,"text":175},"43446732","sastraxi","DRF-spectacular is an okay choice here, you have to manage consistency with return types yourself but the docs and customization options are well done.",{"value":177,"source":92,"evidence":178},"FastAPI or Litestar",[179],{"id":180,"by":181,"text":182},"43446337","stackskipton","There is already plenty available that will do what you want. FastAPI or Litestar are two popular ones.",{"value":184,"source":51,"evidence":185},"RapiDoc",[186,187],{"id":79,"by":11,"text":80},{"id":188,"by":189,"text":190},"43451780","ddorian43","Maybe Rapidoc?",{"comments":192,"answered":33,"key":193},15,[194,195,198],{"id":54,"text":55},{"id":196,"text":197},"43446176","In the examples, I used prefixes to demonstrate API versioning, but you're not limited to this approach. Prefixes can be used for general route structuring as well (like grouping…",{"id":199,"text":200},"43451985","Currently, FastOpenAPI doesn't provide built-in support specifically for documenting streaming APIs. As far as I'm aware, support for streaming (chunked responses) in the OpenAPI…",{"commenters":202,"max_depth":46,"maker_replies":192,"first_comment_mins":34,"lifespan_hours":203},43,88,[205,207,209,211,214,217,219,221,222,225,226,228,232,235,238,241,244,249,253,256,258,261,263,265,268,269,270,271,273,274,275,277,281,283,285,288,291,294,297,301,306,309,311,314,317,319,321,323,325,328,330,333,335,338,341,343,345,347,350,352,354,357,360,363,365,367,368,370,371,374,378,380,382,385,387,390,395],[54,39,39,206,11,34],"maker\u002Fneutral\u002Fidea",[103,39,46,208,104,39],"project\u002Fpositive\u002Fdesign",[196,39,39,210,11,34],"project\u002Fneutral\u002Fdesign",[212,39,41,206,213,39],"43448555","fjdjshsh",[215,39,41,216,100,39],"43452393","project\u002Fneutral\u002Fidea",[154,39,41,218,147,39],"project\u002Fneutral\u002Fexecution",[146,39,41,220,147,39],"project\u002Fneutral\u002Fdocs",[199,39,39,220,11,34],[223,39,39,224,11,34],"43451964","project\u002Fneutral\u002Fnone",[135,39,41,224,136,39],[227,39,39,218,11,34],"43456400",[229,34,39,230,231,39],"43447322","other\u002Fneutral\u002Fidea","wg0",[233,34,39,230,234,39],"43447610","monsieurbanana",[236,34,39,237,231,39],"43455049","commenter\u002Fneutral\u002Fnone",[239,34,41,216,240,39],"43450964","RainyDayTmrw",[242,34,39,230,243,39],"43452331","lvncelot",[245,246,34,247,248,39],"43446309",2,"project\u002Fcritical\u002Fperformance","ltbarcly3",[250,246,39,251,252,39],"43446755","commenter\u002Fneutral\u002Fperformance","dtkav",[254,246,39,251,255,39],"43448272","tempest_",[257,246,39,251,248,39],"43448779",[259,246,39,237,260,39],"43446778","acdha",[262,246,39,237,248,39],"43448748",[264,246,39,237,260,39],"43449592",[266,246,39,251,267,39],"43447143","supriyo-biswas",[95,41,46,208,96,39],[79,41,39,220,11,34],[188,41,41,220,189,39],[110,35,41,272,111,39],"project\u002Fmixed\u002Fdesign",[73,35,39,210,11,34],[99,46,46,208,100,39],[276,46,39,210,11,34],"43452476",[278,279,46,208,280,39],"43462427",6,"s3rius",[282,279,39,218,11,34],"43462850",[284,279,39,218,11,34],"43465551",[286,32,39,251,287,39],"43447347","gister123",[289,32,39,251,290,39],"43447464","qwertox",[292,32,39,237,293,39],"43451162","linkdd",[295,32,39,237,296,39],"43448078","jt_b",[298,299,39,300,11,34],"43479226",8,"maker\u002Fneutral\u002Fnone",[302,303,39,304,305,39],"43446575",9,"other\u002Fneutral\u002Fnone","bravura",[307,303,39,308,252,39],"43446666","other\u002Fneutral\u002Fdocs",[310,303,39,308,305,39],"43447888",[312,303,39,304,313,39],"43447686","servercobra",[114,315,46,316,115,39],10,"project\u002Fpositive\u002Fdocs",[318,33,39,230,252,39],"43446105",[320,33,39,206,11,34],"43446296",[322,33,39,230,252,39],"43446728",[324,33,39,206,11,34],"43447034",[326,33,39,230,327,39],"43446382","RadiozRadioz",[329,33,39,230,252,39],"43446529",[331,33,39,230,332,39],"43447131","DanHulton",[334,33,39,230,252,39],"43453898",[336,33,39,308,337,39],"43452248","jillesvangurp",[339,33,39,340,252,39],"43453866","commenter\u002Fneutral\u002Fidea",[342,33,39,340,337,39],"43461308",[131,344,41,224,132,39],12,[346,344,39,218,11,34],"43446254",[348,344,39,304,349,39],"43446340","scrollaway",[351,344,39,304,132,39],"43446361",[353,344,41,224,132,39],"43446355",[355,344,39,237,356,39],"43446326","jensenbox",[358,344,39,237,359,39],"43446568","mariocesar",[361,344,39,237,362,39],"43447805","vital1k",[364,344,39,237,359,39],"43447936",[180,344,34,366,181,39],"project\u002Fcritical\u002Fidea",[166,344,34,366,167,39],[369,344,39,308,100,39],"43452409",[173,344,39,304,174,39],[372,18,39,230,373,39],"43459521","BerislavLopac",[375,376,34,366,377,39],"43445972",14,"zapnuk",[379,376,41,216,252,39],"43446139",[381,376,39,206,11,34],"43446221",[383,376,39,304,384,39],"43449786","karolinepauls",[386,376,39,237,189,39],"43452140",[388,192,41,224,389,39],"43446959","JodieBenitez",[391,392,46,393,394,39],"43446565",16,"project\u002Fpositive\u002Fnone","adhamsalama",[396,397,46,393,398,39],"43446904",17,"wseqyrku",[],[401,406,411,416,421,425],{"id":402,"name":403,"points":404,"category":405},"43452629","Drum Patterns",495,"creative",{"id":407,"name":408,"points":409,"category":410},"43454915","OpenSpot",470,"productivity",{"id":412,"name":413,"points":414,"category":415},"43456030","Notes - Sight Reading Trainer",313,"learning_science",{"id":417,"name":418,"points":419,"category":420},"43451141","SlideHero",260,"languages",{"id":422,"name":423,"points":424,"category":20},"43438797","Solo Screen",196,{"id":426,"name":427,"points":428,"category":420},"43435438","Torch Lens Maker",179,false,"v2",{"id":432,"name":5,"line":6,"ai":429,"cat":20,"year":13,"points":14,"comments":15,"rec":29,"s":433,"top":18,"kw":434,"maker":11,"domain":10,"tier":19,"attempts":39,"strip":435,"url":9,"mix":436,"praise":91,"objection":119,"sub":21},43445720,0.17,[24,25,26,27,28],"0533030310005035500000500000030301101035",[32,33,34,35],1793991115641]