[{"data":1,"prerenderedAt":368},["ShallowReactive",2],{"project-41307815":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":35,"aspects":36,"strip":44,"post_text":46,"what":47,"said":87,"maker_in_thread":178,"shape":184,"grid":188,"attempts":330,"same_week":331,"maker_shows":213,"maker_hidden":360,"reader_version":361,"card":362},"41307815","Handwriter.ttf","Handwriting Synthesis with Harfbuzz WASM","title","Show HN: Handwriter.ttf – Handwriting Synthesis with Harfbuzz WASM","https:\u002F\u002Fgithub.com\u002Fhsfzxjy\u002Fhandwriter.ttf","github.com","hsfzxjy",1724226425,2024,191,53,419,3515,12,"notable","creative","generative font","library",[24,25,26,27,28],"handwriting synthesis","harfbuzz","wasm shaper","ttf font","rnn","mixed",0.206,{"positive":32,"neutral":18,"mixed":33,"critical":34},9,1,4,26,{"idea":37,"performance":39,"docs":41,"design":42,"execution":43},{"positive":38,"critical":33},5,{"positive":40,"critical":40},0,{"positive":40,"critical":33},{"positive":40,"critical":33},{"positive":40,"critical":33},[40,40,40,40,40,40,45,38,45,45,40,40,33,40,45,45,45,40,33,40,38,38,38,45,38,33,40,45,40,45,45,40,33,38,40,40,40,38,40,38],3,"During the hype of llama.ttf months ago, I was speculating the potential of WASM shaper for even crazier purpose, one that fitter to a font shaper's duty -- to synthesize font at runtime. This project as proof-of-concept implements a synthesizer that generates and rasterizes handwriting-style font, backed by a super-lightweight RNN model (~14MiB).",{"problem":48,"audience":54,"pricing":54,"motivation":55,"time_to_build":54,"stack":62,"openness":84,"stage":85,"team_size":86},{"value":49,"source":50,"evidence":51},"Generates handwriting-style font glyphs at runtime instead of using static font files","maker",[52],{"id":53},"post",null,{"value":56,"source":50,"evidence":57},"Fun proof-of-concept, inspired by llama.ttf; 'no why, just for fun'",[58,59],{"id":53},{"id":60,"by":11,"text":61},"41310871","The answer is \"no why\", just for fun :) Though I learned a lot about how to stuff an NN model in a WASM binary and some tricks to optimize performance.",[63,72,76,80],{"value":64,"source":50,"evidence":65},"WebAssembly",[66,69],{"id":67,"by":11,"text":68},"41310513","wasm has SIMD extension https:\u002F\u002Fgithub.com\u002FWebAssembly\u002Fsimd\u002Fblob\u002Fmaster\u002Fproposals\u002Fsimd\u002FSIMD.md . You can use them even in browsers (e.g. Chrome >= 91)",{"id":70,"by":11,"text":71},"41310742","Yes. The program actually includes an ONNX runtime, which uses SIMD to accelerate NN inference.",{"value":73,"source":50,"evidence":74},"HarfBuzz",[75],{"id":53},{"value":77,"source":50,"evidence":78},"ONNX runtime",[79],{"id":70,"by":11,"text":71},{"value":81,"source":50,"evidence":82},"RNN model (~14MiB)",[83],{"id":53},"open_source","prototype","unknown",{"praise":88,"objections":123,"requests":147,"questions":155,"alternatives":170},[89,108],{"value":90,"source":91,"evidence":92},"Cool and impressive hack","commenter",[93,97,101,105],{"id":94,"by":95,"text":96},"41311083","calebj0seph","Damn, this is impressive! We built a WebGL text renderer with full CJK support using Harfbuzz for our production whiteboard web app. I thought that was complicated until now.",{"id":98,"by":99,"text":100},"41314296","vintermann","So you trained a THAT small RNN to make this good handwriting? I'm actually even more impressed at that than at the crazy pipeline turning it into a font in realtime.",{"id":102,"by":103,"text":104},"41310267","kragen","this is amazing! i'm guessing you can probably get it to antialias without much more work as the demo video shows, it's probably not something you want to have in between you and…",{"id":106,"by":103,"text":107},"41311159","it's super cool!",{"value":109,"source":91,"evidence":110},"Fun and amusing concept",[111,115,119],{"id":112,"by":113,"text":114},"41310847","dancemethis","This is so cursed, there is so much that begs the question - \"why?\"... I love it. I can't wait for the next beautiful nightmare. Maybe someone should mix font rendering with PDF…",{"id":116,"by":117,"text":118},"41318044","piyushtechsavy","Nice demo, for sure a fun app.",{"id":120,"by":121,"text":122},"41317168","thenegation","Best reason!",[124,133,140],{"value":125,"source":91,"evidence":126},"Requires experimental HarfBuzz WASM shaper not enabled in browsers",[127,130],{"id":128,"by":11,"text":129},"41317494","You can run the demo locally following the Usage part. Currently the WASM shaper feature is not enabled in any browser, so the demo won't work in web pages.",{"id":131,"by":11,"text":132},"41310712","You can't test it in a browser, since no browser at present is linked against libharfbuzz with WASM shaper. Instead, one can test it with a modified local program such as gedit…",{"value":134,"source":91,"evidence":135},"Not zoomable; glyphs are pixel-like boxes",[136],{"id":137,"by":138,"text":139},"41318820","amelius","I prefer fonts that can be zoomed.",{"value":141,"source":91,"evidence":142},"Does not preserve handedness",[143],{"id":144,"by":145,"text":146},"41316504","andrewmcwatters","It visually fails to preserve “handedness.”",[148],{"value":149,"source":91,"evidence":150},"Browser demo or GitHub Pages site",[151],{"id":152,"by":153,"text":154},"41310530","a1o","I don't get it, why there's no link to a GitHub pages website to test the thing?",[156,163],{"value":157,"source":91,"evidence":158},"Why use WASM instead of native libharfbuzz",[159],{"id":160,"by":161,"text":162},"41311186","okcdz","If you just want to run locally. Why not using the native libharfbuzz directly? What's the purpose of WASM here?",{"value":164,"source":91,"evidence":165},"Is it based on the user's own handwriting",[166],{"id":167,"by":168,"text":169},"41311262","tombh","I've read the README and watched the video, but I'm still not sure what this is doing? I know it can \"synthesize [a] font at runtime\", so does that mean it's creating a random…",[171],{"value":172,"source":91,"evidence":173},"llama.ttf",[174],{"id":175,"by":176,"text":177},"41315912","a2128","Link to llama.ttf, another fun font that abuses HarfBuzz for anyone interested (it runs a language model inside a font): https:\u002F\u002Ffuglede.github.io\u002Fllama.ttf\u002F The llama.ttf video…",{"comments":32,"answered":179,"key":180},7,[181,182,183],{"id":67,"text":68},{"id":70,"text":71},{"id":128,"text":129},{"commenters":185,"max_depth":179,"maker_replies":32,"first_comment_mins":186,"lifespan_hours":187},38,361,44,[189,193,196,199,203,206,209,212,215,218,222,226,227,230,231,233,236,239,242,246,247,249,253,255,257,259,262,264,266,268,269,273,277,281,283,284,286,289,292,294,297,301,303,306,308,310,314,317,320,323,325,326,328],[190,40,40,191,192,40],"41311249","other\u002Fneutral\u002Fnone","PhilipRoman",[194,40,40,191,195,40],"41312551","petercooper",[197,40,40,191,198,40],"41313153","pandeiro",[200,33,40,201,202,40],"41311559","other\u002Fneutral\u002Fidea","pjmlp",[204,33,40,201,205,40],"41313797","Unearned5161",[207,33,40,208,202,40],"41317463","commenter\u002Fneutral\u002Fnone",[210,33,40,201,211,40],"41318401","fenollp",[167,213,45,214,168,40],2,"project\u002Fneutral\u002Fidea",[216,213,45,214,217,40],"41317872","block_dagger",[219,45,38,220,221,40],"41312610","project\u002Fpositive\u002Fidea","gwern",[223,34,45,224,225,40],"41310447","project\u002Fneutral\u002Fperformance","jcelerier",[67,34,40,224,11,33],[228,34,45,224,229,40],"41310577","jsheard",[70,34,40,224,11,33],[232,34,40,208,225,40],"41310799",[234,34,40,208,235,40],"41310826","erk__",[237,34,33,238,225,40],"41312071","project\u002Fcritical\u002Fidea",[240,34,40,208,241,40],"41315432","jahewson",[243,38,45,244,245,40],"41317399","project\u002Fneutral\u002Fdocs","fulafel",[128,38,40,244,11,33],[248,38,45,244,245,40],"41326045",[250,251,45,214,252,40],"41315240",6,"BigParm",[254,251,40,214,11,33],"41316290",[137,251,33,256,138,40],"project\u002Fcritical\u002Fdesign",[102,179,45,258,103,40],"project\u002Fmixed\u002Fexecution",[260,179,40,261,11,33],"41310628","maker\u002Fneutral\u002Fidea",[106,179,38,263,103,40],"project\u002Fpositive\u002Fnone",[98,265,38,220,99,40],8,[267,265,40,214,11,33],"41316270",[94,32,38,220,95,40],[270,32,45,271,272,40],"41316969","project\u002Fneutral\u002Fnone","MarceColl",[274,275,45,214,276,40],"41319339",10,"adzm",[278,279,38,220,280,40],"41311838",11,"eigenvalue",[152,18,33,282,153,40],"project\u002Fcritical\u002Fdocs",[131,18,40,244,11,33],[160,18,45,285,161,40],"project\u002Fneutral\u002Fexecution",[287,18,40,208,288,40],"41311310","bawolff",[290,18,40,208,291,40],"41312465","0x457",[293,18,45,285,153,40],"41311574",[295,18,40,191,296,40],"41316170","Lockal",[298,299,45,244,300,40],"41310693",13,"einpoklum",[302,299,40,244,11,33],"41310775",[144,304,33,305,145,40],14,"project\u002Fcritical\u002Fexecution",[116,307,38,263,117,40],15,[175,309,40,201,176,40],16,[311,312,40,191,313,40],"41310837",17,"cyberax",[315,312,40,191,316,40],"41310989","noman-land",[318,312,40,191,319,40],"41311434","shove",[321,312,40,191,322,40],"41311558","koolala",[112,324,38,220,113,40],18,[60,324,40,261,11,33],[120,324,38,327,121,40],"maker\u002Fpositive\u002Fnone",[329,324,38,327,113,40],"41317335",[],[332,337,342,347,352,355],{"id":333,"name":334,"points":335,"category":336},"41284703","PgQueuer",376,"languages",{"id":338,"name":339,"points":340,"category":341},"41254740","sqlean-time",274,"data",{"id":343,"name":344,"points":345,"category":346},"41291700","Srcbook",267,"dev_tools",{"id":348,"name":349,"points":350,"category":351},"41252731","polyfight.io",171,"games",{"id":353,"name":354,"points":350,"category":20},"41271014","Blender shortcuts",{"id":356,"name":357,"points":358,"category":359},"41311489","Permify 1.0",154,"infrastructure",false,"v2",{"id":363,"name":5,"line":6,"ai":360,"cat":20,"year":13,"points":14,"comments":15,"rec":29,"s":364,"top":18,"kw":365,"maker":11,"domain":10,"tier":19,"attempts":40,"strip":366,"url":9,"mix":367,"praise":90,"objection":125,"sub":21},41307815,0.21,[24,25,26,27,28],"0000003533001033301055535103033015000505",[32,18,33,34],1793991098448]