[{"data":1,"prerenderedAt":309},["ShallowReactive",2],{"portfolio-runclub-app":3,"all-portfolio":289},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":7,"category":9,"client":10,"timeline":11,"role":12,"date":13,"tags":14,"body":22,"_type":283,"_id":284,"_source":285,"_file":286,"_stem":287,"_extension":288},"\u002Fportfolio\u002Frunclub-app","portfolio",false,"","RunClub — แอปสำหรับชมรมวิ่งและ community นักวิ่งไทย","Mobile","RunClub Thailand","12 สัปดาห์","Mobile Development, UI\u002FUX, Backend API","2024-04-10",[15,16,17,18,19,20,21],"Flutter","Dart","Firebase","Google Maps","Node.js","Express","MongoDB",{"type":23,"children":24,"toc":270},"root",[25,33,39,45,52,66,72,77,83,88,94,99,143,148,253,258],{"type":26,"tag":27,"props":28,"children":30},"element","h2",{"id":29},"ที่มาของโปรเจกต์",[31],{"type":32,"value":29},"text",{"type":26,"tag":34,"props":35,"children":36},"p",{},[37],{"type":32,"value":38},"RunClub เริ่มจาก LINE group นักวิ่งที่มีสมาชิก 3,000+ คน แต่การจัดกิจกรรม ติดตามผล และสร้าง community ผ่าน LINE เริ่มไม่เพียงพอ ลูกค้าต้องการแอปที่ทำให้ running experience เชื่อมต่อกับ community ได้จริง",{"type":26,"tag":27,"props":40,"children":42},{"id":41},"features-หลัก",[43],{"type":32,"value":44},"Features หลัก",{"type":26,"tag":46,"props":47,"children":49},"h3",{"id":48},"gps-activity-tracking",[50],{"type":32,"value":51},"GPS Activity Tracking",{"type":26,"tag":34,"props":53,"children":54},{},[55,57,64],{"type":32,"value":56},"ใช้ ",{"type":26,"tag":58,"props":59,"children":61},"code",{"className":60},[],[62],{"type":32,"value":63},"geolocator",{"type":32,"value":65}," package ร่วมกับ Kalman filter เพื่อลด GPS noise ในพื้นที่ที่มีตึกสูง — ปัญหาหลักของนักวิ่งในกรุงเทพฯ",{"type":26,"tag":46,"props":67,"children":69},{"id":68},"challenge-system",[70],{"type":32,"value":71},"Challenge System",{"type":26,"tag":34,"props":73,"children":74},{},[75],{"type":32,"value":76},"ระบบ challenge ที่ผู้ใช้สร้างเองได้ เช่น \"วิ่ง 100 กม. ใน 30 วัน\" พร้อม leaderboard realtime และ badge rewards",{"type":26,"tag":46,"props":78,"children":80},{"id":79},"social-feed",[81],{"type":32,"value":82},"Social Feed",{"type":26,"tag":34,"props":84,"children":85},{},[86],{"type":32,"value":87},"Feed ที่แสดง activity ของ friends พร้อม kudos system (คล้าย Strava แต่เน้น community ท้องถิ่น)",{"type":26,"tag":27,"props":89,"children":91},{"id":90},"ความท้าทายด้าน-performance",[92],{"type":32,"value":93},"ความท้าทายด้าน Performance",{"type":26,"tag":34,"props":95,"children":96},{},[97],{"type":32,"value":98},"การแสดงผล map route หลังวิ่งเสร็จเป็นจุดที่ต้องปรับแต่ง performance มากที่สุด เพราะ polyline จาก GPS อาจมี 10,000+ จุด เราแก้ด้วย:",{"type":26,"tag":100,"props":101,"children":102},"ol",{},[103,115,125],{"type":26,"tag":104,"props":105,"children":106},"li",{},[107,113],{"type":26,"tag":108,"props":109,"children":110},"strong",{},[111],{"type":32,"value":112},"Douglas-Peucker algorithm",{"type":32,"value":114}," เพื่อ simplify route ก่อน render",{"type":26,"tag":104,"props":116,"children":117},{},[118,123],{"type":26,"tag":108,"props":119,"children":120},{},[121],{"type":32,"value":122},"Lazy loading",{"type":32,"value":124}," สำหรับ activity history ด้วย pagination",{"type":26,"tag":104,"props":126,"children":127},{},[128,133,135,141],{"type":26,"tag":108,"props":129,"children":130},{},[131],{"type":32,"value":132},"Image caching",{"type":32,"value":134}," ด้วย ",{"type":26,"tag":58,"props":136,"children":138},{"className":137},[],[139],{"type":32,"value":140},"cached_network_image",{"type":32,"value":142}," สำหรับ profile pictures",{"type":26,"tag":27,"props":144,"children":146},{"id":145},"ผลลัพธ์",[147],{"type":32,"value":145},{"type":26,"tag":149,"props":150,"children":151},"table",{},[152,176],{"type":26,"tag":153,"props":154,"children":155},"thead",{},[156],{"type":26,"tag":157,"props":158,"children":159},"tr",{},[160,166,171],{"type":26,"tag":161,"props":162,"children":163},"th",{},[164],{"type":32,"value":165},"Metric",{"type":26,"tag":161,"props":167,"children":168},{},[169],{"type":32,"value":170},"เป้าหมาย",{"type":26,"tag":161,"props":172,"children":173},{},[174],{"type":32,"value":175},"ผล 3 เดือน",{"type":26,"tag":177,"props":178,"children":179},"tbody",{},[180,199,217,235],{"type":26,"tag":157,"props":181,"children":182},{},[183,189,194],{"type":26,"tag":184,"props":185,"children":186},"td",{},[187],{"type":32,"value":188},"Daily Active Users",{"type":26,"tag":184,"props":190,"children":191},{},[192],{"type":32,"value":193},"2,000",{"type":26,"tag":184,"props":195,"children":196},{},[197],{"type":32,"value":198},"4,200",{"type":26,"tag":157,"props":200,"children":201},{},[202,207,212],{"type":26,"tag":184,"props":203,"children":204},{},[205],{"type":32,"value":206},"Session duration",{"type":26,"tag":184,"props":208,"children":209},{},[210],{"type":32,"value":211},"8 นาที",{"type":26,"tag":184,"props":213,"children":214},{},[215],{"type":32,"value":216},"14 นาที",{"type":26,"tag":157,"props":218,"children":219},{},[220,225,230],{"type":26,"tag":184,"props":221,"children":222},{},[223],{"type":32,"value":224},"App Store Rating",{"type":26,"tag":184,"props":226,"children":227},{},[228],{"type":32,"value":229},"4.0",{"type":26,"tag":184,"props":231,"children":232},{},[233],{"type":32,"value":234},"4.7 ⭐",{"type":26,"tag":157,"props":236,"children":237},{},[238,243,248],{"type":26,"tag":184,"props":239,"children":240},{},[241],{"type":32,"value":242},"Crash-free rate",{"type":26,"tag":184,"props":244,"children":245},{},[246],{"type":32,"value":247},"99%",{"type":26,"tag":184,"props":249,"children":250},{},[251],{"type":32,"value":252},"99.6%",{"type":26,"tag":27,"props":254,"children":256},{"id":255},"สิ่งที่ภูมิใจที่สุด",[257],{"type":32,"value":255},{"type":26,"tag":34,"props":259,"children":260},{},[261,263,268],{"type":32,"value":262},"การออกแบบ ",{"type":26,"tag":108,"props":264,"children":265},{},[266],{"type":32,"value":267},"onboarding flow",{"type":32,"value":269}," ที่ทำให้ผู้ใช้ใหม่เห็น \"aha moment\" ได้เร็ว — เราออกแบบให้ผู้ใช้เห็น community ของ sub-district ตัวเองภายใน 30 วินาทีหลัง sign up โดยไม่ต้องค้นหาเอง ส่งผลให้ Day-7 retention อยู่ที่ 58% ซึ่งสูงกว่า benchmark ของ fitness app ทั่วไป",{"title":7,"searchDepth":271,"depth":271,"links":272},2,[273,274,280,281,282],{"id":29,"depth":271,"text":29},{"id":41,"depth":271,"text":44,"children":275},[276,278,279],{"id":48,"depth":277,"text":51},3,{"id":68,"depth":277,"text":71},{"id":79,"depth":277,"text":82},{"id":90,"depth":271,"text":93},{"id":145,"depth":271,"text":145},{"id":255,"depth":271,"text":255},"markdown","content:portfolio:runclub-app.md","content","portfolio\u002Frunclub-app.md","portfolio\u002Frunclub-app","md",[290,294,298,299,303,306],{"_path":291,"title":292,"category":293},"\u002Fportfolio\u002Ffreshmarket-platform","FreshMarket — แพลตฟอร์มตลาดสดออนไลน์","E-commerce",{"_path":295,"title":296,"category":297},"\u002Fportfolio\u002Fmedsync-dashboard","MedSync — ระบบจัดการคลินิกและนัดหมายผู้ป่วย","SaaS",{"_path":4,"title":8,"category":9},{"_path":300,"title":301,"category":302},"\u002Fportfolio\u002Fbaan-design-studio","Baan Design Studio — Portfolio Website สำหรับสตูดิโอออกแบบ","Web",{"_path":304,"title":305,"category":297},"\u002Fportfolio\u002Forchard-saas","Orchard — HR & Payroll SaaS สำหรับ SME ไทย",{"_path":307,"title":308,"category":9},"\u002Fportfolio\u002Fbitebuddy-food-app","BiteBuddy — แอปค้นหาร้านอาหารและรีวิวเพื่อชุมชน",1779878303325]