[{"data":1,"prerenderedAt":329},["ShallowReactive",2],{"project-13749461":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":44,"post_text":47,"what":48,"said":103,"maker_in_thread":204,"shape":211,"grid":214,"attempts":291,"same_week":292,"maker_shows":212,"maker_hidden":321,"reader_version":322,"card":323},"13749461","Staffjoy V2","I announced two weeks ago that we are shutting down Staffjoy [1] and open sourcing our code.","maker","Show HN: Staffjoy V2, now open source","https:\u002F\u002Fgithub.com\u002Fstaffjoy\u002Fv2","github.com","philip1209",1488237299,2017,113,35,392,2242,18,"notable","web_saas","workforce scheduling","web_app",[24,25,26,27,28],"shift scheduling","open source","staff scheduling","sms scheduling","microservices","curious",0.103,{"positive":32,"neutral":33,"mixed":34,"critical":35},4,9,1,2,16,{"design":38,"idea":40,"privacy":41,"execution":42,"performance":43},{"positive":34,"critical":39},0,{"positive":39,"critical":39},{"positive":39,"critical":34},{"positive":39,"critical":34},{"positive":39,"critical":39},[39,45,39,45,39,34,39,46,39,45,45,39,46,39,45,39,45,39,39,39,45,39,39,46,45,34,39,45,39,46,39,39,45,39,39],3,5,null,{"problem":49,"audience":55,"pricing":47,"motivation":59,"time_to_build":47,"stack":63,"openness":100,"stage":101,"team_size":102},{"value":50,"source":7,"evidence":51},"Scheduling staff for small businesses, replacing spreadsheets with text message based scheduling",[52],{"id":53,"by":11,"text":54},"13749472","I announced two weeks ago that we are shutting down Staffjoy [1] and open sourcing our code. Last week, our primary V1 repo was submitted to HN [2]. Yesterday, I open-sourced our…",{"value":56,"source":7,"evidence":57},"Small businesses with hourly workers",[58],{"id":53,"by":11,"text":54},{"value":60,"source":7,"evidence":61},"Company is shutting down; maker open-sourced the code",[62],{"id":53,"by":11,"text":54},[64,73,80,86,92],{"value":65,"source":7,"evidence":66},"Go",[67,70],{"id":68,"by":11,"text":69},"13751373","Yes. Protocol buffers and grpc-gateway made it easy to scaffold out a quick api, write all the interior logic, and know that there would not be any major issues due to strong…",{"id":71,"by":11,"text":72},"13756323","No, I was having issues with too much \"magic\" in Python libraries. I'm continuing to use Go for my new company. In particular, running SQLAlchemy was a nightmare (see a reddit…",{"value":74,"source":7,"evidence":75},"Protocol Buffers and gRPC-gateway",[76,79],{"id":77,"by":11,"text":78},"13751512","Yes. I would always use gRPC-gateway in the future. It's an amazing library. Check out the `protobuf` folder - we basically defined the whole api there in a language-agnostic…",{"id":68,"by":11,"text":69},{"value":81,"source":7,"evidence":82},"Kubernetes",[83],{"id":84,"by":11,"text":85},"13751322","Yes, in hindsight I would have done more of a monolith datastore with fewer services. Faraday for auth was amazing - we could put anything we wanted behind it and centralize…",{"value":87,"source":7,"evidence":88},"Bazel",[89],{"id":90,"by":11,"text":91},"13756563","The Bazel build system [1] is the open-source version of Google's internal build system. It's tough to set up, but once you do - it caches all builds, down to the docker…",{"value":93,"source":94,"evidence":95},"PostgreSQL","commenter",[96],{"id":97,"by":98,"text":99},"13760461","dragonsh","Thanks for the reply and insight. Why you had issues with magic in Python libraries, as I understand one of the main design goals of Python and its libraries is \"Explicit is…","open_source","launched","team",{"praise":104,"objections":120,"requests":142,"questions":160,"alternatives":185},[105,116],{"value":106,"source":94,"evidence":107},"Monorepo and microservice architecture are useful to learn from",[108,112],{"id":109,"by":110,"text":111},"13751441","troyk","We are sharing your sentiment that a lot of our user-facing errors could be limited by moving away from weak typing (current stack is Ruby). In hindsight, did Go and protobuf…",{"id":113,"by":114,"text":115},"13751091","kondro","Interesting to see how other companies' application stacks end up looking. Thanks for releasing this.",{"value":117,"source":7,"evidence":118},"gRPC-gateway and auto-generated API docs sped up development",[119],{"id":77,"by":11,"text":78},[121,128,138],{"value":122,"source":7,"evidence":123},"Architecture is overengineered for the product's size",[124,127],{"id":125,"by":11,"text":126},"13751408","It's overengineered for today. The datastore should have been a monolith. However, splitting up accounts and companies made us think in terms of microservices. We were prepared…",{"id":84,"by":11,"text":85},{"value":129,"source":94,"evidence":130},"Backend code reads like a rushed prototype with no tests",[131,135],{"id":132,"by":133,"text":134},"13751202","zalmoxes","Their Go services definitely read like a very beginner or prototype project. There are no tests, lots of global state, and little separation of concerns between request\u002Fresponse…",{"id":136,"by":11,"text":137},"13751349","Yes, it was a rush job. It started off nice, with tests and stuff. Then, we had to hit a deadline. I wrote 100% of the backend code. There were no other authors. Getting tons of…",{"value":139,"source":7,"evidence":140},"Build times are long (around 10 minutes)",[141],{"id":90,"by":11,"text":91},[143,150],{"value":144,"source":94,"evidence":145},"Explain why the pivot to V2 happened instead of adding SMS to V1",[146],{"id":147,"by":148,"text":149},"13751082","tarr11","That's a really pitch great deck, Philip. Thanks for sharing. I have to admit - I don't totally understand why you pivoted for your V2. Couldn't you have just added on the \"SMS\"…",{"value":151,"source":94,"evidence":152},"Explain the choice of Go over Python and the dynamic typing problems",[153,157],{"id":154,"by":155,"text":156},"13753033","Dowwie","To what extent did you try to refactor your Python code\u002Farchitecture prior to adopting Go for v2? Also, could you share one example of the dynamic typing related problems?…",{"id":158,"by":98,"text":159},"13753923","Having worked with flask+Python eco-system and golang do you think if you continued with Python for v2 it might have been better (since you were already familiar with Python even…",[161,172,179],{"value":162,"source":94,"evidence":163},"Would the architecture be done differently with hindsight?",[164,168],{"id":165,"by":166,"text":167},"13750897","hoodoof","In hindsight, what would you have done differently with the architecture of this software? It's got alot of moving parts - do you think it is overengineered?",{"id":169,"by":170,"text":171},"13750975","spacetexas","What are your thoughts on the re-write in hindsight, would you have done it differently looking back on it? Perhaps have gone for a more 'monolithic' approach?",{"value":173,"source":94,"evidence":174},"Why build an external REST API alongside a working web app?",[175],{"id":176,"by":177,"text":178},"13763838","tixocloud","Thank you so much for sharing all that you've learned throughout your journey and for sharing your architecture. Curious but with a working web app, what was the motivation for…",{"value":180,"source":94,"evidence":181},"Why use microservices and a React SPA for a single developer?",[182],{"id":183,"by":133,"text":184},"13751414","I really enjoyed that episode :) Curious, since it was just you writing the backend, what was the reasoning behind doing microservices + react SPA. Both of those require a lot of…",[186,192,196,200],{"value":187,"source":7,"evidence":188},"Homebase",[189],{"id":190,"by":11,"text":191},"13751394","We had some failed deploys due to usability issues. We also felt like we were starting to converge to the same set of features similar to a bunch of other companies (Homebase,…",{"value":193,"source":7,"evidence":194},"When I Work",[195],{"id":190,"by":11,"text":191},{"value":197,"source":7,"evidence":198},"Humanity\u002FShiftPlanning",[199],{"id":190,"by":11,"text":191},{"value":201,"source":7,"evidence":202},"Deputy",[203],{"id":190,"by":11,"text":191},{"comments":205,"answered":206,"key":207},17,6,[208,209,210],{"id":53,"text":54},{"id":125,"text":126},{"id":190,"text":191},{"commenters":212,"max_depth":206,"maker_replies":205,"first_comment_mins":34,"lifespan_hours":213},14,39,[215,217,219,220,222,224,228,231,235,238,239,240,241,244,247,248,250,252,255,258,260,261,263,265,267,271,273,274,275,277,279,281,283,288,289],[53,39,39,216,11,34],"project\u002Fneutral\u002Fnone",[165,39,45,218,166,39],"maker\u002Fneutral\u002Fdesign",[125,39,39,218,11,34],[147,39,45,221,148,39],"maker\u002Fneutral\u002Fidea",[190,39,39,223,11,34],"project\u002Fneutral\u002Fidea",[225,39,34,226,227,39],"13751117","project\u002Fcritical\u002Fprivacy","tedmiston",[229,39,39,230,11,34],"13751410","project\u002Fneutral\u002Fprivacy",[232,39,46,233,234,39],"13752685","maker\u002Fpositive\u002Fnone","bsbechtel",[236,39,39,237,11,34],"13755328","maker\u002Fneutral\u002Fnone",[176,39,45,218,177,39],[109,34,45,218,110,39],[77,34,39,218,11,34],[242,34,46,243,110,39],"13751578","maker\u002Fpositive\u002Fdesign",[245,34,39,246,11,34],"13751588","other\u002Fneutral\u002Fdocs",[169,35,45,218,170,39],[84,35,39,249,11,34],"project\u002Fmixed\u002Fdesign",[154,45,45,251,155,39],"maker\u002Fneutral\u002Fexecution",[253,45,39,254,11,34],"13756503","project\u002Fneutral\u002Fdesign",[256,32,39,257,166,39],"13750891","other\u002Fneutral\u002Fnone",[68,32,39,259,11,34],"project\u002Fpositive\u002Fdesign",[158,46,45,221,98,39],[71,46,39,262,11,34],"project\u002Fneutral\u002Fexecution",[97,46,39,264,98,39],"commenter\u002Fneutral\u002Fnone",[113,206,46,266,114,39],"project\u002Fpositive\u002Fnone",[268,206,45,269,270,39],"13751145","project\u002Fmixed\u002Fexecution","zackify",[132,206,34,272,133,39],"project\u002Fcritical\u002Fexecution",[136,206,39,262,11,34],[183,206,45,218,133,39],[276,206,39,254,11,34],"13751478",[278,206,46,233,133,39],"13751499",[280,206,39,272,11,34],"13751328",[282,206,39,272,11,34],"13751325",[284,285,45,286,287,39],"13753872",7,"project\u002Fneutral\u002Fperformance","OutsmartDan",[90,285,39,286,11,34],[290,285,39,237,11,34],"13758615",[],[293,298,303,307,312,317],{"id":294,"name":295,"points":296,"category":297},"13763469","Gutenberg",305,"dev_tools",{"id":299,"name":300,"points":301,"category":302},"13729301","PDFLayoutTextStripper",283,"data",{"id":304,"name":305,"points":306,"category":297},"13762077","BootShellCredentialProvider",264,{"id":308,"name":309,"points":310,"category":311},"13762032","Lumix Engine",260,"games",{"id":313,"name":314,"points":315,"category":316},"13724118","Hasura",259,"infrastructure",{"id":318,"name":319,"points":320,"category":302},"13738051","PumpkinDB",190,false,"v2",{"id":324,"name":5,"line":6,"ai":321,"cat":20,"year":13,"points":14,"comments":15,"rec":29,"s":325,"top":18,"kw":326,"maker":11,"domain":10,"tier":19,"attempts":39,"strip":327,"url":9,"mix":328,"praise":106,"objection":122,"sub":21},13749461,0.1,[24,25,26,27,28],"03030105033050303000300531030500300",[32,33,34,35],1794036553059]