[{"data":1,"prerenderedAt":832},["ShallowReactive",2],{"project-45526890":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":28,"sentiment":29,"stance_mix":30,"scored_comments":35,"aspects":36,"strip":49,"post_text":51,"what":52,"said":77,"maker_in_thread":224,"shape":237,"grid":242,"attempts":794,"same_week":795,"maker_shows":44,"maker_hidden":824,"reader_version":825,"card":826},"45526890","Lavandula","A web framework in C","title","Show HN: I built a web framework in C","https:\u002F\u002Fgithub.com\u002Fashtonjamesd\u002Flavandula","github.com","ashtonjamesd",1760013928,2025,420,218,106,3837,3,"legend","dev_tools","web framework","library",[24,25,26,27],"c web framework","c http server","c backend","lavandula","mixed",0.271,{"positive":31,"neutral":32,"mixed":33,"critical":34},30,28,6,19,83,{"execution":37,"idea":40,"design":43,"docs":45,"performance":47,"privacy":48},{"positive":38,"critical":39},5,15,{"positive":41,"critical":42},13,2,{"positive":42,"critical":44},1,{"positive":42,"critical":46},0,{"positive":46,"critical":44},{"positive":46,"critical":46},[38,46,46,46,46,46,46,46,46,46,46,38,38,50,42,50,38,18,18,18,44,44,42,38,38,50,18,18,38,44,42,50,50,44,38,38,46,18,44,46],4,null,{"problem":53,"audience":51,"pricing":51,"motivation":60,"time_to_build":51,"stack":67,"openness":74,"stage":75,"team_size":76},{"value":54,"source":55,"evidence":56},"Makes server-side web development in C feel like a high-level language","maker",[57],{"id":58,"by":11,"text":59},"45527440","For fun! And because I wanted to create a framework that makes coding in C feel like a high level language (mainly for fun though).",{"value":61,"source":55,"evidence":62},"For fun and to learn how web servers work",[63,64],{"id":58,"by":11,"text":59},{"id":65,"by":11,"text":66},"45527654","True. Also, I love the C language and I don't get joy out of writing in many other languages. Additionally, I've wanted to make something like this just to learn more about how…",[68],{"value":69,"source":70,"evidence":71},"C","inferred",[72],{"id":73},"post","open_source","unknown","solo",{"praise":78,"objections":113,"requests":151,"questions":182,"alternatives":208},[79,99,106],{"value":80,"source":81,"evidence":82},"Clean, readable, well-organised C code","commenter",[83,87,91,95],{"id":84,"by":85,"text":86},"45527986","faxmeyourcode","This is some of the cleanest, modern looking, beautiful C code I've seen in a while. I know it's not the kernel, and there's probably good reasons for lots of #ifdef…",{"id":88,"by":89,"text":90},"45535224","faichai","Some unsolicited feedback: I think the appRoute macro obfuscates the types and signatures, and introduces some unnecessary indirection. I would get rid of it. Related, the…",{"id":92,"by":93,"text":94},"45528208","kahlonel","That's a great example of how to write C in 2025. Congrats and well done.",{"id":96,"by":97,"text":98},"45538049","lordleft","I am convinced that well written C code is more aesthetically pleasing than well written code in other languages. Great job and thanks for sharing.",{"value":100,"source":81,"evidence":101},"Good test framework design",[102],{"id":103,"by":104,"text":105},"45528603","elevation","Nice work! I like the little test framework you built. Have you considered making runTest a macro so that you can print the name of the test along with the test result?",{"value":107,"source":81,"evidence":108},"Good README and clean dotenv parser",[109],{"id":110,"by":111,"text":112},"45533023","koito17","The README gets straight to the point and I really like that. Additionally, the .env file parser is quite clean. https:\u002F\u002Fgithub.com\u002Fashtonjamesd\u002Flavandula\u002Fblob\u002Fmain\u002Fsrc\u002Fdotenv.c…",[114,133,141],{"value":115,"source":81,"evidence":116},"HTTP parser has memory safety issues and unchecked malloc\u002Fsnprintf calls",[117,121,125,129],{"id":118,"by":119,"text":120},"45532155","mistivia","It's very dangerous to write a http parser from scratch in C. This can be very vulnerable without rigorous testing. To get a useful web framework for production in C, I think…",{"id":122,"by":123,"text":124},"45534230","OneLessThing","There is a heap overflow in the http parser. Should I spoil it or let people find it on their own?",{"id":126,"by":127,"text":128},"45528224","hgs3","The code is very readable and well organized. My only major critique is that there's very little error checking, e.g. there are many calls to snprintf and malloc without checking…",{"id":130,"by":131,"text":132},"45536972","jll29","Thanks for sharing; small is beautiful. A couple of points of feedback: - check return value from malloc(); - consider using your own arena allocator (which gets a larger block…",{"value":134,"source":81,"evidence":135},"Uses no non-blocking I\u002FO or threading; limited request buffer",[136,137],{"id":126,"by":127,"text":128},{"id":138,"by":139,"text":140},"45534428","201984","Very nice! A couple of notes: you'll want to use non-blocking I\u002FO and an event loop to prevent one slow client from locking up the whole server. You should also check for partial…",{"value":142,"source":81,"evidence":143},"Questionable usefulness compared to mature frameworks",[144,147],{"id":145,"by":11,"text":146},"45527832","That's fair. And I do agree. The use cases for something like this are very thin compared to what tools you can use out there instead, Django, Rails, Express, etc. All of which…",{"id":148,"by":149,"text":150},"45527437","JKCalhoun","I'm stupid — is this to create web apps that run on the server? More or less replacing PHP or whatever?",[152,163,174,178],{"value":153,"source":81,"evidence":154},"Add HTML templating",[155,159],{"id":156,"by":157,"text":158},"45528218","codegeek","People, stop trying to be so serious and nitpick this project. This is a great example of an actual HN worthy share. Someone built a cool project and explored the possibilities…",{"id":160,"by":161,"text":162},"45528136","coreyp_1","I'm wanting to do the same thing. I've also already written a language (in C) to generate HTML (a template language), so these two go hand-in-hand!",{"value":164,"source":81,"evidence":165},"Add TLS\u002FHTTPS support",[166,170],{"id":167,"by":168,"text":169},"45528117","globalnode","I like this, thanks for sharing. I recently did some work with a python web server using the basehttpserver and it was amazingly easy. Pythons even got built in tls support,…",{"id":171,"by":172,"text":173},"45530693","leptons","Does it do HTTPS? I'd be interested to try it on ESP32 but it has to support HTTPS.",{"value":175,"source":81,"evidence":176},"Add IPv6 support",[177],{"id":138,"by":139,"text":140},{"value":179,"source":81,"evidence":180},"Print test names via macro",[181],{"id":103,"by":104,"text":105},[183,194,201],{"value":184,"source":81,"evidence":185},"Does it compile and what C standard does it use?",[186,190],{"id":187,"by":188,"text":189},"45527541","gwbas1c","I don't understand the example. Does it even compile? It's been a long time since I've used C, so maybe it's using some syntax that I'm unaware of? IE: What defines \"home\" that…",{"id":191,"by":192,"text":193},"45531616","ranger_danger","which version of C does this conform to?",{"value":195,"source":81,"evidence":196},"Is it one thread per request?",[197],{"id":198,"by":199,"text":200},"45536226","ak39","Nice. Is if a one thread per request model? Does it support async await type of architecture?",{"value":202,"source":81,"evidence":203},"How compatible is it with embedded devices?",[204],{"id":205,"by":206,"text":207},"45528806","dariosalvi78","How compatible is this with embedded devices? How much does this depend on OS APIs?",[209,213,220],{"value":210,"source":81,"evidence":211},"libmicrohttpd, libevent, fastcgi",[212],{"id":118,"by":119,"text":120},{"value":214,"source":81,"evidence":215},"Jetzig",[216],{"id":217,"by":218,"text":219},"45527967","sroerick","Hi, I think this is great. I've really enjoyed working with Jetzig, which is sort of similar. I also love the BSD C CGI Postgres stack. I'm just a CRUDmonkey with mostly python…",{"value":221,"source":55,"evidence":222},"Django, Rails, Express",[223],{"id":145,"by":11,"text":146},{"comments":225,"answered":226,"key":227},18,8,[228,231,234],{"id":229,"text":230},"45528149","Wow! That really means a lot because I always make a lot of effort to make sure my code is just that :) Appreciate you saying that!",{"id":232,"text":233},"45528550","Thank you, I really appreciate you saying that! Yes it's on the backlog and will be fun to implement :)",{"id":235,"text":236},"45528528","Thank you for the feedback, it is appreciated! I did intend to implement parallelization as a later feature so it's good to bring it up.",{"commenters":238,"max_depth":239,"maker_replies":225,"first_comment_mins":240,"lifespan_hours":241},117,10,29,155,[243,245,247,251,255,258,260,263,265,268,270,273,276,279,281,284,286,288,291,293,296,299,301,304,307,309,311,313,316,319,322,325,328,331,333,335,338,340,342,345,348,350,353,356,359,362,364,367,370,373,375,377,380,382,385,387,390,393,396,399,401,405,408,410,411,415,416,417,418,421,425,428,431,435,438,440,443,445,446,448,452,454,458,460,461,465,467,470,472,475,478,480,482,485,489,491,494,497,500,502,504,507,510,512,514,517,519,522,525,527,530,532,534,536,538,541,543,545,546,548,551,555,560,564,568,570,572,574,576,578,580,584,587,589,591,595,599,602,605,606,608,610,614,616,620,624,629,631,634,638,642,644,648,652,655,657,659,661,663,665,668,671,674,676,679,682,685,689,693,695,699,703,706,707,710,712,715,719,720,722,723,725,728,730,733,735,737,739,741,743,746,749,751,753,755,757,760,764,767,769,772,774,776,778,780,782,784,786,788,790,792],[84,46,38,244,85,46],"project\u002Fpositive\u002Fexecution",[229,46,46,246,11,44],"maker\u002Fpositive\u002Fnone",[248,46,18,249,250,46],"45528738","project\u002Fmixed\u002Fexecution","jacquesm",[252,46,46,253,254,46],"45528639","other\u002Fneutral\u002Fnone","citizenpaul",[256,46,46,253,257,46],"45529395","copperx",[259,46,46,253,254,46],"45529917",[261,46,46,253,262,46],"45529548","assimpleaspossi",[264,46,46,253,254,46],"45529977",[266,46,46,253,267,46],"45529572","noufalibrahim",[269,46,46,253,254,46],"45529885",[271,46,46,253,272,46],"45530631","jcelerier",[274,46,46,253,275,46],"45533697","6510",[277,46,46,253,278,46],"45535479","moron4hire",[280,46,46,253,275,46],"45538085",[282,46,46,253,283,46],"45545561","jaza",[285,46,46,253,250,46],"45534482",[287,46,46,253,267,46],"45555590",[289,46,46,253,290,46],"45530197","wkjagt",[292,46,46,253,172,46],"45530659",[294,46,46,253,295,46],"45530913","DanielHB",[297,46,46,253,298,46],"45531060","lelanthran",[300,46,46,253,192,46],"45531600",[302,46,46,253,303,46],"45531957","EvanAnderson",[305,46,46,253,306,46],"45533508","bionsystem",[308,46,46,253,275,46],"45537553",[310,46,46,253,298,46],"45538211",[312,46,46,253,275,46],"45538730",[314,46,46,253,315,46],"45538841","1718627440",[317,46,46,253,318,46],"45533255","supportengineer",[320,46,46,253,321,46],"45536397","munchlax",[323,46,46,253,324,46],"45539060","throwaway2037",[326,46,46,253,327,46],"45531238","dingdingdang",[329,46,46,253,330,46],"45534830","koolba",[332,46,46,253,85,46],"45531270",[334,46,46,253,157,46],"45531714",[336,46,46,253,337,46],"45531917","TZubiri",[339,46,46,253,306,46],"45533634",[341,46,46,253,315,46],"45533692",[343,46,46,253,344,46],"45535383","usefulcat",[346,46,46,253,347,46],"45536646","Hunpeter",[349,46,46,253,315,46],"45538725",[351,46,46,253,352,46],"45533771","jug",[354,46,46,253,355,46],"45534192","sgsjchs",[357,46,46,253,358,46],"45535088","kopirgan",[360,46,46,253,361,46],"45536102","tealpod",[363,46,46,253,315,46],"45538954",[365,46,46,253,366,46],"45533967","ActorNightly",[368,46,46,253,369,46],"45534550","hunter-gatherer",[371,46,46,253,372,46],"45534957","rockemsockem",[374,46,46,253,366,46],"45540983",[376,46,46,253,372,46],"45541012",[378,46,46,253,379,46],"45545271","catlifeonmars",[381,46,46,253,372,46],"45599833",[383,46,46,253,384,46],"45535393","messe",[386,46,46,253,366,46],"45541004",[388,46,46,253,389,46],"45536285","Jataman606",[391,46,46,253,392,46],"45536675","frabert",[394,46,46,253,395,46],"45537368","wmwragg",[397,46,46,253,398,46],"45534292","diegof79",[400,46,46,253,278,46],"45535554",[402,46,46,403,404,46],"45534388","commenter\u002Fneutral\u002Fnone","bsder",[406,46,46,403,407,46],"45536270","resonious",[156,44,38,409,157,46],"project\u002Fpositive\u002Fidea",[232,44,46,246,11,44],[412,44,38,413,414,46],"45533690","project\u002Fpositive\u002Fnone","whatamidoingyo",[126,42,18,249,127,46],[235,42,46,246,11,44],[217,18,38,409,218,46],[419,50,38,409,420,46],"45527728","lubesGordi",[422,50,44,423,424,46],"45527913","project\u002Fcritical\u002Fexecution","maybewhenthesun",[426,50,46,427,11,44],"45528126","maker\u002Fneutral\u002Fnone",[429,50,38,246,430,46],"45528180","jvanderbot",[432,50,18,433,434,46],"45537374","maker\u002Fneutral\u002Fexecution","le-mark",[436,50,46,253,437,46],"45543687","isubkhankulov",[439,50,46,253,430,46],"45528169",[441,38,38,409,442,46],"45527908","levkk",[444,38,46,246,11,44],"45528132",[118,33,44,423,119,46],[447,33,44,423,250,46],"45534476",[449,33,18,450,451,46],"45535245","project\u002Fneutral\u002Fexecution","wallmountedtv",[453,33,46,253,324,46],"45539214",[455,456,38,413,457,46],"45527879",7,"fallingmeat",[459,456,46,246,11,44],"45528152",[138,226,18,433,139,46],[462,463,38,413,464,46],"45527886",9,"freetonik",[466,463,38,246,464,46],"45527893",[468,463,46,403,469,46],"45528088","Teknomadix",[471,463,46,246,11,44],"45528108",[473,463,46,253,474,46],"45530593","dang",[476,463,46,253,477,46],"45534493","pierrec",[479,463,44,423,298,46],"45539049",[88,239,18,481,89,46],"project\u002Fmixed\u002Fdesign",[483,239,46,484,11,44],"45542518","maker\u002Fneutral\u002Fdesign",[486,487,38,409,488,46],"45527854",11,"p0w3n3d",[490,487,46,246,11,44],"45527872",[110,492,38,493,111,46],12,"project\u002Fpositive\u002Fdocs",[495,492,18,496,330,46],"45534852","project\u002Fneutral\u002Fidea",[498,492,44,423,499,46],"45536614","jpc0",[501,492,44,423,298,46],"45538772",[503,41,38,409,104,46],"45528764",[505,41,46,403,506,46],"45531427","jimbokun",[508,41,46,403,509,46],"45550672","EasyMark",[130,511,18,249,131,46],14,[513,511,46,403,315,46],"45566011",[515,39,46,253,516,46],"45528524","dboon",[518,39,46,253,434,46],"45537519",[520,521,44,423,250,46],"45528012",16,[523,521,46,403,524,46],"45529699","gpm",[526,521,46,403,250,46],"45529768",[528,521,46,403,529,46],"45534421","CyberDildonics",[531,521,46,403,315,46],"45540539",[533,521,46,403,529,46],"45540767",[535,521,46,403,298,46],"45538931",[537,521,46,403,250,46],"45540125",[539,521,44,540,139,46],"45534446","project\u002Fcritical\u002Fperformance",[542,521,46,403,250,46],"45534468",[160,544,46,253,161,46],17,[122,225,44,423,123,46],[547,225,44,423,123,46],"45535198",[549,225,18,550,315,46],"45540602","project\u002Fmixed\u002Fdocs",[552,34,38,553,554,46],"45538701","maker\u002Fpositive\u002Fexecution","notepad0x90",[556,557,38,558,559,46],"45570549",20,"project\u002Fpositive\u002Fdesign","hollowonepl",[561,562,38,409,563,46],"45529475",21,"orochimaaru",[565,566,18,427,567,46],"45534891",22,"lebimas",[569,566,46,427,11,44],"45536609",[571,566,18,427,567,46],"45537961",[573,566,46,427,11,44],"45542631",[92,575,38,244,93,46],23,[577,575,44,423,298,46],"45539010",[96,579,38,558,97,46],24,[581,582,38,493,583,46],"45528407",25,"OutputRiff",[585,586,18,496,358,46],"45539650",26,[167,588,38,409,168,46],27,[590,588,46,427,11,44],"45528203",[592,32,18,593,594,46],"45528829","project\u002Fmixed\u002Fprivacy","sim7c00",[596,32,18,597,598,46],"45529611","project\u002Fneutral\u002Fprivacy","severino",[600,32,18,597,601,46],"45530700","sweetjuly",[603,32,18,597,604,46],"45530896","kjs3",[103,240,18,450,104,46],[607,240,46,246,11,44],"45528626",[609,240,18,450,104,46],"45528845",[611,31,18,612,613,46],"45528762","project\u002Fneutral\u002Fdesign","jcmontx",[615,31,46,403,509,46],"45550691",[617,618,18,450,619,46],"45531012",31,"krowek",[621,622,38,409,623,46],"45537489",32,"shevy-java",[625,626,44,627,628,46],"45538198",33,"project\u002Fcritical\u002Fdesign","Silphendio",[171,630,18,597,172,46],34,[205,632,18,633,206,46],35,"project\u002Fneutral\u002Fperformance",[635,636,38,244,637,46],"45531668",36,"Maksadbek",[639,640,38,409,641,46],"45531383",37,"SvenL",[198,643,18,633,199,46],38,[645,646,38,409,647,46],"45535770",39,"z3ratul163071",[649,650,44,423,651,46],"45531107",40,"cyberax",[653,650,46,403,654,46],"45531888","badsectoracula",[656,650,44,423,250,46],"45534510",[658,650,46,403,654,46],"45541584",[660,650,46,403,315,46],"45541647",[662,650,46,403,654,46],"45541875",[664,650,44,423,651,46],"45536217",[187,666,18,667,188,46],41,"project\u002Fneutral\u002Fdocs",[669,666,18,667,670,46],"45527609","diath",[672,666,46,673,11,44],"45527617","maker\u002Fneutral\u002Fdocs",[675,666,18,667,188,46],"45528393",[677,666,18,667,678,46],"45530727","nodesocket",[680,666,18,667,681,46],"45527628","hofrogs",[683,666,18,667,684,46],"45527630","rnhmjoj",[686,687,38,413,688,46],"45534018",42,"BiraIgnacio",[690,691,38,413,692,46],"45528455",43,"defraudbah",[191,694,18,667,192,46],44,[696,697,18,496,698,46],"45527479",45,"EGreg",[700,701,18,427,702,46],"45527259",46,"guerrilla",[704,701,46,253,705,46],"45527419","hmry",[58,701,46,427,11,44],[708,701,38,409,709,46],"45527525","cozzyd",[148,711,18,496,149,46],47,[713,711,46,714,11,44],"45527447","maker\u002Fneutral\u002Fidea",[716,711,44,717,718,46],"45527591","project\u002Fcritical\u002Fidea","sixtyj",[65,711,46,427,11,44],[721,711,44,717,718,46],"45527732",[145,711,46,717,11,44],[724,711,38,246,718,46],"45528035",[726,711,46,403,727,46],"45527993","seanssel",[729,711,46,253,718,46],"45528133",[731,711,46,403,732,46],"45528499","chrsig",[734,711,46,403,718,46],"45528771",[736,711,38,553,250,46],"45528930",[738,711,46,403,604,46],"45531095",[740,711,46,403,604,46],"45530986",[742,711,46,253,594,46],"45528926",[744,711,46,253,745,46],"45527674","password54321",[747,711,46,253,748,46],"45527900","jermaustin1",[750,711,46,403,718,46],"45528049",[752,711,46,403,748,46],"45528617",[754,711,46,253,748,46],"45528185",[756,711,46,253,718,46],"45528332",[758,711,38,409,759,46],"45527890","Hackbraten",[761,762,46,253,763,46],"45527278",48,"yodon",[765,762,18,450,766,46],"45527495","johnisgood",[768,762,44,423,763,46],"45527702",[770,762,46,403,771,46],"45528127","hu3",[773,762,44,423,763,46],"45528278",[775,762,46,403,771,46],"45528548",[777,762,46,253,474,46],"45530668",[779,762,46,253,763,46],"45531645",[781,762,46,253,474,46],"45532637",[783,762,46,403,474,46],"45530694",[785,762,46,403,766,46],"45532768",[787,762,46,403,763,46],"45533593",[789,762,46,403,766,46],"45535822",[791,762,46,403,763,46],"45537621",[793,762,46,403,766,46],"45580295",[],[796,801,806,811,815,820],{"id":797,"name":798,"points":799,"category":800},"45536694","Discrete Distribution Networks",656,"ai",{"id":802,"name":803,"points":804,"category":805},"45567770","SQLite Online",465,"data",{"id":807,"name":808,"points":809,"category":810},"45529393","keyer",411,"hardware",{"id":812,"name":813,"points":814,"category":20},"45590949","Halloy",381,{"id":816,"name":817,"points":818,"category":819},"45558611","Ambi",314,"consumer_social",{"id":821,"name":822,"points":823,"category":20},"45553995","Rift",212,false,"v2",{"id":827,"name":5,"line":6,"ai":824,"cat":20,"year":13,"points":14,"comments":15,"rec":28,"s":828,"top":18,"kw":829,"maker":11,"domain":10,"tier":19,"attempts":46,"strip":830,"url":9,"mix":831,"praise":80,"objection":115,"sub":21},45526890,0.27,[24,25,26,27],"5000000000055424533311255433512441550310",[31,32,33,34],1794036683880]