Paper Yard Book Bar — booktail (build log)
สามวันทำ booktail ให้ร้านหนังสือกับ Claude Code วิธีสั่งซื้อถูกทำใหม่ 6 รอบจนวนกลับมาที่วิธีที่ร้านขายอยู่แล้ว บทเรียนคือทดสอบบนเว็บจริง และทำให้ถอยได้ง่ายสำคัญกว่าเป๊ะตั้งแต่แรก
ผมกับ AI ทำระบบจ่ายเงินเสร็จ แล้วโยนทิ้งในอีกราว 2 ชั่วโมงต่อมา 🍸📚
บันทึก 3 วัน (23 commits) ทำ "booktail" ให้ร้านหนังสือที่เสิร์ฟหนังสือเป็นค็อกเทล
👉 ลองเขย่าได้ที่ paperyard.co/bookbar
เบื้องหลังตั้งแต่ prompt แรกจนถึงวันที่ลูกค้าใช้จริง คนทำมีสามคน ผม เพื่อนที่เป็นเจ้าของร้าน กับ Claude Code
━━━━━━━━━━
🍸 booktail คืออะไร
Book Bar ของ Paper Yard ไม่ได้ให้ลูกค้าเลือกหนังสือเป็นเล่มบนหน้าเว็บ แต่ให้ "สั่งเครื่องดื่ม" เป็นสูตรแทน ตอนนี้เมนูมี 7 ขั้น:
• TYPE: Fiction หรือ Non-fiction
• BASE: แนว
• FLAVOR: อารมณ์
• INGREDIENTS: ธีม
• STRENGTH: อ่านหนักแค่ไหน
• PACE: จังหวะการอ่าน
• FINISH: อ่านจบแล้วรู้สึกยังไง
แล้วเลือกขนาดแก้ว S ฿299 / M ฿399 / L ฿599 จากนั้น Booktender ของร้านจะเลือกหนังสือจริงมาเสิร์ฟให้
booktail คือตัวช่วยผสมสูตร กด SHAKE! แล้วหนังสือ 3D จะร่วงลงมาซ้อนกันบนเคาน์เตอร์ สันแต่ละเล่มคือส่วนผสมหนึ่งอย่าง ขั้นไหนรู้อยู่แล้วว่าอยากได้อะไรก็ล็อกไว้ ที่เหลือปล่อยให้สุ่ม
พอกด SERVE หนังสือจะละลายลงเชคเกอร์ เขย่า แล้วรินออกมาเป็นค็อกเทลสีตามสูตรของเรา พร้อมปก 3 เล่มที่คุณอาจจะได้อ่าน
━━━━━━━━━━
🌙 Day 0: โฟลเดอร์เปล่ากับทวีตเดียว
ห้าทุ่มครึ่งคืนวันที่ 2 ต.ค. ผมเปิดโฟลเดอร์เปล่า พิมพ์ prompt แรกเป็นภาษาอังกฤษงู ๆ ปลา ๆ ประมาณว่า "ช่วยทำ book randomizer ให้เพื่อนหน่อย ใช้ CI ของร้าน อยากได้ฟีลแบบทวีตของ Meng To"
(อันที่เป็นชั้นหนังสือ Three.js ได้แรงบันดาลใจจากเว็บ Stripe Press เลื่อนแนวนอน เปิดเล่มพลิกหน้าได้)
แล้วสั่งให้มัน grill ผมด้วยคำถามก่อนเริ่ม
แต่สิ่งแรกที่ AI ไปเจอ ทำให้ทั้งโปรเจกต์เปลี่ยนไปเลยครับ:
หน้า Book Bar ไม่มีชื่อหนังสือสักเล่ม มีแค่ฟอร์มสั่ง 6 ขั้น หน้าตาเหมือนใบ order slip ของบาร์
randomizer เลยสุ่มหนังสือไม่ได้ ต้องสุ่ม "สูตร" แทน คอนเซปต์บาร์ค็อกเทลมาจากตรงนี้
เรื่องสีของร้านก็ไม่ง่าย:
• มัน curl HTML ของหน้า Wix มาทั้งก้อน (1.67 MB) ก่อน
• พอจะเปิดดูในเบราว์เซอร์ browser tool ก็พังทั้งสองตัว ตัวหนึ่งบอกว่า profile ใช้งานอยู่ อีกตัว timeout
• มันเลยดาวน์โหลดรูปของหน้ามาวัดสีเอง ได้สีกรมท่าของโลโก้ (#0F3256) มาเป็นสีหลัก
มันถามมา 4 ข้อ ผมตอบไปหนึ่งรอบ พอมันจะถามรอบสอง ผมตัดบทเลย:
"ไปรีเสิร์ชเอง แล้วทำมาหลาย ๆ direction ให้ผมเลือก" 😅
ก่อนจะมีแอนิเมชันสักตัว มันเขียนไฟล์เมนูขึ้นมาหนึ่งไฟล์ ลอกข้อความจากฟอร์มร้านมาคำต่อคำ แล้วให้ทุกหน้าดึงจากที่เดียวนี้
เมนูตอนนั้น: 8 base × 10 flavor × 16 ingredients (เลือก 2) × 4 style × 8 finish ได้ 307,200 สูตร
แล้วก็เจอคำว่า "Horror/Triller" ในฟอร์มจริงของร้านตั้งแต่ตอนนั้น (เรื่องนี้จะกลับมาอีก)
━━━━━━━━━━
🤖 คืนแรก: AI 10 ตัว แข่งกันทำ 4 prototype
ผมสั่ง workflow ชุดหนึ่งให้รันข้ามคืน แล้วไปนอน ข้างในมี:
• researcher 2 ตัว
ตัวแรกค้น Mobbin 15 ครั้ง ไปหยิบแพทเทิร์นมาจากหลายที่ เช่น การสุ่มแบบเติมคำของ YouTube Music จังหวะเปิดกล่องสุ่มของ Grab และหน้าตาใบเสร็จ / boarding pass แล้วตัดวงล้อแบบคาสิโนทิ้ง เพราะ "ดูเหมือนโปรหลอกลวง"
ตัวที่สองไปศึกษาเทคนิคจากเดโมของ Meng To ซึ่งไม่ได้ระบุ license ไว้ เลยตั้งกติกาว่า ดูวิธีคิดได้ แต่ห้ามลอกโค้ด เขียนใหม่ทั้งหมด
• builder 4 ตัว ทำคนละ direction
• reviewer 4 ตัว ที่ถูกสั่งว่า "อย่าเชื่อรายงานของ builder" หน้าที่คือทำให้มันพัง:
กด SHAKE 8 ครั้งติด กดรัวกลางแอนิเมชัน บล็อก CDN เปิด reduced motion ลองจอ 3 ขนาด
รวม 10 agents, 622 tool calls, 1 ชั่วโมง 54 นาที
ตื่นมาเจอ prototype 4 แบบที่ใช้งานได้จริงวางเทียบกันในหน้าเดียว
- Back Bar: ชั้นหนังสือ 5 ชั้นหมุนเหมือนสล็อต
- Mystery Book: หนังสือ "?" เล่มเดียวเปิดพลิกหน้าเป็นสูตร (ใกล้ Meng To ที่สุด)
- Order Slip: ไม่มี 3D ใบสั่งพลิกตัวอักษรแบบป้ายสนามบิน แล้วปั๊มตรา SHAKEN สีแดง
- Spine Stack: หนังสือร่วงลงบนบาร์ทีละเล่ม อ่านสันเรียงกันแล้วได้สูตร
AI เชียร์ Spine Stack เหตุผลคือ "กองสันหนังสือคือผลลัพธ์ที่ลูกค้าน่าจะแคปไปแชร์มากที่สุด"
ส่วน reviewer ก็จับบั๊กจริงได้ เช่น
• ภาษาไทยตัดบรรทัดกลางวลี เป็น "เร็ว วางไม่ / ลง"
• สล็อตหยุดที่หนังสือเล่มเดียวกันสองชั้นติดกัน
มีเรื่องหนึ่งที่ AI ตัดสินใจเองแล้วผมชอบมาก คือ size ไม่สุ่ม เพราะ size คือราคา ไม่ควรมีใครโดนสุ่มเป็นออเดอร์ ฿599 โดยไม่ตั้งใจ
(running gag: preview server ในเครื่องโดน time limit ฆ่าไป 3 รอบ ตั้งแต่ตีสี่ถึงก่อนเที่ยง)
━━━━━━━━━━
☀️ Day 1: "minimal and liquid glass ish"
เช้ามาผมถามว่าจะรวมหน้าเลือกกับหน้าสุ่มยังไง พร้อมแนบ brief แรกจากเจ้าของร้าน:
"minimal and liquid glass ish"
ตลกตรงที่ brand brief ที่ AI เขียนให้ตัวเองเมื่อคืนเขียนไว้ชัด ๆ ว่า "no glassmorphism" 😂
แต่รสนิยมเจ้าของร้านชนะ research brief ครับ Spine Stack กลายเป็นฉากขาว ๆ มีแผงกระจกลอยอยู่แผ่นเดียว หนังสือ 3D เบลออยู่ข้างหลัง
reviewer รอบสองยังเจอของจริงอีก
• ปุ่มกดสูงแค่ 34px (แก้เป็น 44px จำตัวเลขนี้ไว้นะครับ)
• บนจอ 360×640 ปุ่ม SHAKE! ไปอยู่ที่ y=658 คือหลุดขอบจอ
• แม่กุญแจล็อกกับไม่ล็อกหน้าตาแทบเหมือนกัน
ตอนนั้นแต่ละขั้นมีกุญแจอยู่แล้ว แต่โหมดสุ่มกับโหมดเลือกยังแยกกัน ผมสั่งต่อว่า "lock in that ui" เลยรวมเป็นหน้าเดียว ทุกขั้นมีแม่กุญแจที่หัว:
• สุ่มได้ = สีอ่อน กุญแจเปิด กด SHAKE ใหม่ก็เปลี่ยน
• เลือกเอง/ล็อกไว้ = navy ทึบ สุ่มกี่ทีก็อยู่
นี่แหละหัวใจของ booktail คือ randomizer ที่เราคุมได้บางส่วน
🚀 Deploy แรก
Dockerfile 4 บรรทัด (Caddy เสิร์ฟไฟล์ static) Docker ในเครื่องงอแง 3 รอบ
พอผมพิมพ์ "u can use railway cli for me" มันสร้าง project ผูก GitHub แล้วออก domain ในราว 2 นาที
ขึ้นจริงตอนบ่ายโมงสิบ เกือบ 14 ชั่วโมงหลัง prompt แรก (รวมเวลานอนแล้ว) ส่วนการ push ผมกดเองทุกครั้ง AI ไม่ push ให้
━━━━━━━━━━
🍹 "หนังสือทั้งหมดแปลงร่างเป็นแก้วค็อกเทล"
เกือบหนึ่งทุ่ม เจ้าของร้านส่งไอเดียมาอีก ผมก๊อปข้อความส่งให้ AI ทั้งดุ้น:
"มันทำเป็นแบบ พอกดแล้ว มีระดับน้ำท่วมขึ้นมาได้มะ เหมือนเติมส่วนผสมลงในแก้ว แล้วพอกดเสิร์ฟ หนังสือทั้งหมดแปลงร่างเป็นแก้วค็อกเทล"
ผมแปะลิงก์ motion.dev ไปด้วย ภายในชั่วโมงเดียว:
• แผงฟอร์มกลายเป็นแก้ว เลือกขั้นไหนก็มีน้ำสีไหลเข้ามาเป็นชั้น ๆ ผิวน้ำกระเพื่อมแบบ spring
• กด SERVE หนังสือลอยขึ้นมาต่อกันเป็นรูปแก้วมาร์ตินี่ ตรงตามที่เจ้าของร้านพูดเป๊ะ ๆ
(มีบั๊กเล็ก ๆ ด้วย คือแก้วใสเรนเดอร์ออกมาเป็นสีเทาแบน ต้องเอาฉากหลังไปวางไว้ข้างหลังมันถึงจะใส)
แต่ขึ้น live ได้ราว 2 นาที ผมก็รู้ว่ามันไม่ใช่ภาพที่อยู่ในหัว เลยพิมพ์ไปว่า
"each book turn into each ingredient then get pour into a shaker then shake to booktail"
AI ลบเวอร์ชันมาร์ตินี่ทิ้งทั้งหมด ไม่ได้ซ่อนไว้หลัง flag แล้วทำพิธีผสมยาวราว 5.4 วินาทีขึ้นมาแทน:
- มีเชคเกอร์เงินฝาน้ำเงินวางบนเคาน์เตอร์
- หนังสือโค้งลอยข้ามไป ค้างให้เห็นชื่อแวบหนึ่ง
- ย้อมเป็นสีของตัวเอง
- หดเป็นสายน้ำไหลลงเชคเกอร์
- ปิดฝา เขย่า 4 ครั้งครึ่งแบบช้าลงเรื่อย ๆ
- รินเป็นสีไล่ระดับสีเดียว (shaken, not layered)
จาก feedback ถึงขึ้น live ราวชั่วโมงเดียว บวกปรับตามผมอีก 45 นาที
แต่ทุกอย่างถึงตรงนี้ทดสอบในเบราว์เซอร์จำลองที่ไม่มีหน้าจอทั้งหมด รายงานทุกฉบับลงท้ายคล้าย ๆ กันว่า "ยังไม่ได้ลองบนมือถือจริงเลยนะ"
ซึ่งก็จริง เรื่องนี้กลับมาเล่นงานผมใน Day 3
━━━━━━━━━━
🎨 Day 2: สี, Wix และหนังสือจริงบนชั้น
ก่อนเที่ยงคืน ผมขอให้ใส่สีและทำให้ใช้ใน Wix ของร้านได้
ตัวเลือกทั้ง 46 ตัวได้สีเครื่องดื่มของตัวเอง
• Horror = สีเลือด
• Crime = สีเบอร์เบิน
• Non-fiction = มัทฉะ
• "ทำลายจิตใจได้เลย" = black cherry
• "Bittersweet" = สีคัมปารี
ส่วนที่สาย dev น่าจะชอบ: สีจะจัดแค่ไหน ตัวหนังสือต้องยังอ่านออก
โค้ดเลยคำนวณ contrast ตอนรัน แล้วจำกัดความเข้มของสีโดยตั้งเป้าไว้ที่ 4.65:1 (ส่วนผสมที่แย่ที่สุดวัดได้ 4.61:1 ยังเกิน 4.5 ของ WCAG AA) สีเลือดบนฟอร์มเลยถูกลดลงเป็นชมพู สีจริงเต็ม ๆ ไปโผล่ตอนรินกับในแก้ว
Wix รอบแรกผมเลือกแบบที่กระทบของเดิมน้อยที่สุด คือให้แอปอยู่ในกล่อง Embed HTML แล้วติ๊กตัวเลือกในฟอร์มเดิมของร้านให้อัตโนมัติ
จำ Horror/Triller ได้มั้ยครับ สคริปต์ติ๊กฟอร์มต้องลองสะกดแบบในฟอร์มก่อน เพราะฟอร์มจริงรับแค่ตัวสะกดนั้น ไม่งั้นติ๊กไม่ติด
จากนั้นก็เงียบไป 15 ชั่วโมง
บ่ายสามโมงกว่า ผมได้ screenshot จากเจ้าของร้าน กล่อง embed แสดงข้อความยาวเป็นพรืด เพราะสิ่งที่แปะลงไปคือไฟล์ README (วิธีติดตั้ง) แทนไฟล์โค้ด
ไม่ใช่ความผิดเจ้าของร้านเลยครับ คู่มือที่ผมกับ AI เขียนมันไม่ชัดเอง README รอบต่อมาเลยเขียนให้ชัดว่า "แค่แปะ" แล้วเช็กแค่ ID ของฟอร์ม
แล้วแผนก็เปลี่ยนอีกสองรอบในบ่ายเดียว
• รวมทั้งแอปเป็นไฟล์เดียวไว้แปะใน Wix (2,523 บรรทัด) ทดสอบแล้วเหมือนค้าง สุดท้ายไม่ใช่บั๊ก เครื่องทดสอบเรนเดอร์ 3D ด้วย software เลยใช้เวลาเขย่ากับเสิร์ฟ 68 วินาที
• ผมอยากให้ flow จบในแอปเลย AI หยุดถามก่อน เพราะเรื่องนี้แตะเงิน แล้วเสนอมา 3 ทาง ผมเลือก Wix Payments ราคาคิดฝั่ง server จาก size อย่างเดียว browser แก้ราคาไม่ได้
📦 กวาดทั้งร้าน
ผมให้มันไปหาหนังสือทุกเล่มของ paperyard.co
• หน้าสินค้าหนักหน้าละราว 2 MB scrape ไม่ไหว มันเลยไปใช้ storefront API สาธารณะของ Wix (token แบบ visitor ที่ browser ทุกตัวได้อยู่แล้ว) ดึงทีละ 100
• ได้สินค้าหลายพันชิ้น ตัดของหมด นิตยสาร มังงะ หนังสือเด็ก พรีออเดอร์ออก เหลือราว 3 พันเล่ม
• แต่ละเล่มติด tag ตามหมวดของร้านกับคีย์เวิร์ดไทย
• ตัวจับคู่ให้น้ำหนัก ingredients 4, flavor กับ finish อย่างละ 2, style 1 เลือกจำนวนหน้าตาม size และลดอันดับเล่ม 2 ขึ้นไปของซีรีส์
• สุ่มสูตร 2,000 รอบ (กับเมนูเก่า) ไม่มีรอบไหนว่างเลย
ตรงนี้ AI เตือนขึ้นมาเองโดยไม่มีใครถาม ว่าถ้าโชว์หนังสือพร้อมราคาของมันเอง (ซึ่งหลายเล่มถูกกว่า ฿299) ลูกค้าอาจไปซื้อเล่มนั้นแทน booktail ก็ได้ ให้ไปถามเจ้าของร้านก่อน
🐛 บั๊กที่จับได้จากคำถามบรรทัดเดียว
ผมถามแค่ว่า "it work with railway v right"
มันไม่ตอบว่าใช่ แต่ build Docker image ตัวเดียวกับที่ Railway ใช้มารันเอง เจอว่าบนเดสก์ท็อป เขย่าครั้งแรกได้แก้วเปล่า ไม่มีหนังสือ
สาเหตุคือรายการหนังสือรอโหลดหลัง font กับ three.js จาก CDN ถ้า CDN ช้า แอนิเมชันเสิร์ฟจบก่อนรายการมาถึง แก้ไม่กี่บรรทัด เจอก่อนลูกค้าจะเจอ
💬 แชทของเจ้าของร้าน 4 ไอเดีย จบด้วย "555"
"เขยิบตำแหน่งหนังสือมาด้านซ้ายในเวอร์เดสท็อปหน่อยสิ"
"…ควรขึ้นราคาตามจริงมากกว่าราคาตามไซส์ป่ะ"
"หรือหนังสือแช่ในแก้ว"
"หรือใช้ให้มันเลือกผลลัพธ์แทนเรา แต่นักอ่านไม่ต้องเห็น 555"
ผมพิมพ์ไปว่า "let do 3 idea"
AI ตีความว่า "ไอเดียที่ 3" และบอกออกมาตรง ๆ ว่ามันเข้าใจแบบนี้ ผมเลยแก้ได้ใน 12 นาที (ผมหมายถึงทั้ง 3 ไอเดีย ผมพิมพ์กำกวมเองครับ)
ผลคือหนังสือจริงจากชั้นร้านร่วงลงไปแช่ในแก้ว หันปกเข้ากล้อง ราคาเป็นราคาจริงของเล่ม กดแล้วไปหน้าสินค้า
ผ่านไปครึ่งชั่วโมง ผมอยาก pivot เป็นแบบ Blind Date with a Book
ประโยคแรกที่ AI ตอบคือ "ปัญหาใหญ่สุดคือหน้า Railway ตอนนี้โชว์หนังสือให้เห็นอยู่" แปลว่าฟีเจอร์ที่เพิ่งทำเสร็จไปคือสิ่งที่ต้องซ่อน 🙃
━━━━━━━━━━
🔁 Day 3: สร้างร้านทั้งร้าน แล้วโยนทิ้ง
เกือบเก้าโมงเช้า เจ้าของร้านส่ง spec ใหม่มา: โอนเงินแล้วแนบสลิป ส่งอีเมลยืนยันให้ทั้งลูกค้าและร้าน
"ไม่ต้องใช้ wix pay หรือถ้า ai มันเชื่อม stripe ได้ เดี๋ยวส่งให้"
ผมเติมเองอีกข้อว่า ไม่เอา Wix เลยด้วย
AI ถาม 4 ข้อก่อนลงมือ เพราะงานนี้เปลี่ยนเว็บ static ให้กลายเป็น server ที่รับเงิน ผมตอบตอนบ่าย จากนั้นมันใช้เวลาแค่ราว 12 นาที:
• Node server 293 บรรทัด ไม่พึ่ง dependency สักตัว
• ราคาคิดจาก catalog ฝั่ง server ไม่เชื่อ browser
• สลิปไม่เกิน 5 MB เช็กชนิดไฟล์จาก bytes จริง
• honeypot + จำกัด 6 ออเดอร์ต่อ 10 นาทีต่อ IP
• ไม่มี database ใช้อีเมลของร้านเป็นบันทึกออเดอร์
อีก 6 นาทีต่อมา Stripe Checkout (บัตร + PromptPay) ก็มา ไม่ใช้ SDK ตรวจลายเซ็น webhook เอง ทดสอบกับ Stripe ปลอมในเครื่อง ผ่าน 14/14
(ใช่ครับ ปลอมอีกแล้ว แต่สุดท้ายก็ไม่ได้ใช้จริงอยู่ดี)
บ่ายสี่โมง ผมพิมพ์ไปว่า
"sorry i change it alot but i think the final v should connect to wix because it can connect to existing stock version and stuff"
AI ตอบว่า "No need to apologise" แล้วเห็นด้วย สต็อก ออเดอร์ และการจ่ายเงินอยู่ใน Wix อยู่แล้ว
🕵️ แล้วก็เจอเรื่องที่หน้าชาที่สุดของโปรเจกต์
Claude in Chrome ใช้ใน Arc ไม่ได้ ผมเลยต่อ MCP ทางการของ Wix ให้มันอ่านเว็บร้านแทน มันเข้าไปสำรวจแบบอ่านอย่างเดียว แล้วรายงานกลับมาว่า
"booktail ไม่ได้อยู่บนหน้านี้ embed ที่เตรียมไว้ไม่เคยถูกติดตั้งเลย"
งาน embed, ติ๊กฟอร์ม, Wix Payments ตลอดสองวัน ไม่เคยไปถึงลูกค้าสักคน 🫠 ถ้าไม่สำรวจก่อนลงมือ ผมคงสร้างทับของที่ไม่มีอยู่จริงไปอีกนาน
ผมตัดสินใจสองข้อ:
• ไม่แตะระบบจ่ายเงินของเจ้าของร้านเลย ส่งลูกค้าไปตะกร้าปกติของ Wix
• ทดสอบบนหน้าทดสอบก่อน
แล้วร้านบน Railway ก็โดน revert ทั้งก้อน โค้ดร้าน 807 บรรทัดหายไปในคำสั่งเดียว อายุรวมราว 2 ชั่วโมง 20 นาที ที่ทิ้งได้ฟรีเพราะยังไม่เคย push
(คำสั่งเดียวกันนั้นดึงโค้ด Wix เก่า 3,741 บรรทัดกลับมาด้วย ซึ่งอยู่ได้แค่ราว 10 นาทีก่อนโดนลบอีกรอบ)
👐 ช่วงนี้ผมเป็น "มือ" ให้ AI
เพราะมันกดใน Wix Editor ไม่ได้ มันดูจาก screenshot แล้วบอกผมทีละขั้น:
- เปิด Dev Mode
- ตั้งชื่อ module ใหม่ (ไม่ให้เป็น "new-module")
- ตั้ง ID ให้กล่อง embed
- กด publish แล้วพัง
แต่ไม่ใช่เพราะโค้ดเรา หน้าเดิมมีโค้ดเก่าค้างอยู่ ผมพิมพ์ไปว่า "i just click pubblish with error" แล้ว Wix ก็ยอม publish ให้
ทดสอบบนเว็บจริงครั้งแรก หนังสือ "ในกระจกหม่นมัว" ราคาลดเหลือ ฿180 ลงตะกร้าร้านได้จริง (หยุดที่ตะกร้า ไม่ได้สั่งจริง)
แต่ตอนเพิ่งตื่น (cold start) backend ของ Wix ตอบช้ากว่า 6 วินาทีที่โค้ดรอไว้ เลยขยายเป็น 15 วินาที แล้วอีกราวชั่วโมงต่อมาก็เพิ่ม ping ปลุก backend ตั้งแต่โหลดหน้า
📱 วิดีโอ 7 วินาทีจากมือถือเจ้าของร้าน
วิดีโอยาว 7.27 วินาที AI ตัดเป็นเฟรมมาไล่ดู แล้วไปลองซ้ำในเครื่องจนเจอว่า
• หนังสือเปลี่ยนเล่มต่อหน้าลูกค้า (เล่ม ฿323 กลายเป็นเล่ม ฿112 พอสต็อกตอบกลับ)
• บนมือถือ ปุ่ม SERVE หายไปหลังดึงแผงขึ้น
ส่วนคำว่า "แถบมันห่าง" AI ตีความว่าหมายถึงรอนาน ผมส่งรูปกลับไปว่า "this one is visual gap"
แล้วมันกำลังจะไปทดสอบบนหน้า Wix จำลองในเครื่อง ผมเลยเบรกไว้:
"why use fake page you can just go in here … fake page is like you testing with your own answer"
ประโยคนี้กลายเป็นกฎถาวรของโปรเจกต์ไปแล้ว
พอไปดูบนหน้าจริงขนาดมือถือ ใช้ 2 นาทีก็เจอ: การ์ดผลลัพธ์กิน 413 จาก 697px ของกรอบ ระหว่างเสิร์ฟเลยมีที่ว่างโล่ง ๆ ราว 400px ข้างล่าง แก้วเล็กไปหลบอยู่หลังปุ่ม ••• ลอยของ Wix
ลูกค้าไม่ต้องซื้อเล่มที่ระบบเลือก แต่ซื้อ "ขนาดแก้ว" ราคาตายตัว แล้วร้านเลือกเล่มให้
• การ์ดโชว์ปก 3 เล่มใต้หัวข้อ "เล่มที่คุณอาจจะได้"
• สุ่มจาก 30 เล่มที่ตรงสูตรที่สุดและมีของจริง ออกแบบให้ไม่ซ้ำในการเข้าหนึ่งครั้ง (ลองแล้ว 4 รอบ 12 ปก ไม่ซ้ำเลย)
• สูตรทั้งหมดแนบไปกับออเดอร์ให้ Booktender
🛑 ตรงนี้มีจังหวะ guardrail ที่ผมชอบ
AI จะสร้างสินค้า size ในร้านจริงผ่าน connector แต่ระบบ permission ของ Claude Code กันไว้ เพราะเป็นการเขียนข้อมูลลงร้านจริงที่ผมยังไม่ได้อนุมัติ สุดท้ายเจ้าของร้านสร้างสินค้าเองกับมือ
(ระบบเดียวกันนี้ขยันจนบล็อกการ grep ไฟล์ index.html ธรรมดา ๆ ว่าเป็น "real-world transaction" ด้วย 555)
📜 หัวค่ำ เจ้าของร้านส่งเมนูใหม่ทั้งชุดมา
เป็น 7 ขั้น มี TYPE (Fiction / Non-fiction) แยก BASE กับ INGREDIENTS คนละชุด มี STRENGTH ตั้งแต่ "Light อ่านง่าย สบาย ๆ" ไปจนถึง "Extra Strong ขอแบบอ่านแล้วโลกไม่เหมือนเดิม"
ไอเดียเดิมก็กลับมาด้วย "shake เสร็จปุ๊บ โชว์ลิสต์หนังสือสามเล่มที่คุณอาจจะได้อ่าน"
ข้อความแรกที่ส่งมาตัดหายไปบางส่วน AI เลยถามกลับ 3 ข้อ
ผมสะกิดไปทีหนึ่ง "why dont you make the change for me eh…" มันเปลี่ยนไปตั้งสมมติฐานเองสองข้อแล้วลงมือ แต่ 10 วินาทีต่อมา ผมยังหัวร้อนพิมพ์ตามไปอีกว่า "just do the change why f***ing yap" 🙈
9 นาทีหลังจากนั้น เมนูใหม่ ฟอร์มแยกสาย และ catalog ที่ติด tag ใหม่ 3,522 เล่มก็ commit เรียบร้อย พร้อมสมมติฐานเขียนไว้ใน commit
ตัวเลขตอนติด tag ใหม่บอกอะไรเยอะ
• "Literary" ตรงกับหนังสือ 923 เล่ม
• "มิตรภาพ" ได้ 3 เล่ม
• "Bittersweet" ได้เล่มเดียว
• และมี 4 ตัวเลือกที่ไม่ตรงกับเล่มไหนเลย (ไม่นับ Surprise Me ที่ตั้งใจให้เป็นไพ่ป่าอยู่แล้ว)
คีย์เวิร์ดไปได้แค่นี้ ที่เหลือต้องเป็นคน ซึ่งก็คือ Booktender
🔥 ทดสอบรอบถัดมาเจอเซอร์ไพรส์: หน้าทดสอบ redirect ไปหน้าจริงแล้ว
booktail อยู่บนหน้าที่ลูกค้าเข้าจริงแล้ว (ใครย้ายผมก็ยังไม่รู้ AI ถามว่า "Did your friend move it there?" ไม่มีใครตอบ 555) แต่ปุ่มสั่งขึ้น "ใส่ตะกร้าไม่สำเร็จ"
รอบนี้ไม่มี "ลองใหม่อีกทีนะ" เลย ทุกครั้ง AI ไปดัก network call ของหน้าจริงมาดูก่อน:
- หน้ายังเรียกฟังก์ชันเก่าอยู่ แปลว่าโค้ดใหม่ยังไม่ได้ publish
- ผมพิมพ์คำสั่ง copy ไฟล์ แต่ดันมีจุดติดท้ายชื่อไฟล์ไปด้วย 😂 เลยยังเป็นโค้ดเก่า
- ครั้งที่สามเรียกฟังก์ชันใหม่แล้วแต่ยัง error พออ่านข้อมูลร้านถึงเจอว่า สินค้าขนาด S/M/L ถูกสร้างโดยไม่มีรหัสสินค้า (SKU) แต่โค้ดหาด้วย SKU เลยเปลี่ยนไปหาจากชื่อใน URL ของสินค้าแทน แก้ไฟล์เดียว
สองทุ่มครึ่ง แก้ว M ฿399 ลงตะกร้าร้านได้จริง พร้อมสูตรใน note ของออเดอร์
ช่วงที่เพิ่งย้ายขึ้นหน้าจริง ปุ่มสั่งยังใช้ไม่ได้อยู่พักหนึ่ง ต้นเหตุสุดท้ายคือช่องที่ว่างอยู่ในข้อมูลสินค้า ไม่ใช่โค้ด
งานสุดท้ายห้าทุ่มกว่า เจ้าของร้านขอให้ปุ่มตัวเลือกเล็กลง ได้แถวละ 2-3 อัน จาก 44px เหลือ 34px ซึ่งก็คือกลับไปที่ 34px ที่ reviewer เคยติไว้วันแรก 😅 รสนิยมเจ้าของร้านชนะอีกแล้ว และลดช่องว่างเหนือหูจับของแผงจาก 44px เหลือ 12px ตรวจบนเว็บจริงขนาด iPhone 13 จบ
━━━━━━━━━━
🧭 6 วิธีสั่งซื้อ ใน 59 ชั่วโมง
ย้อนดู git แล้ว ส่วนที่ยากที่สุดไม่ใช่ 3D แต่คือการหาว่าร้านอยากขายแบบไหน นับจาก commit แรกถึง commit สุดท้ายราว 59 ชั่วโมง วิธีเปลี่ยนสูตรเป็นออเดอร์ถูกทำใหม่ 6 รอบ
- deep link ไปฟอร์ม Wix + script ติ๊กให้
- ส่งข้อความจาก embed ไปติ๊กฟอร์มบนหน้าจริง
- Wix Payments อยู่ในแอป
- Railway เป็นร้านเอง โอนเงิน + สลิป + Stripe ทำเสร็จแล้ว revert
- หนังสือที่บาร์เลือกลงตะกร้า Wix ตามสต็อกและราคาจริง
- ซื้อ size ราคาตายตัว ร้านเลือกเล่ม ← ที่ใช้อยู่ตอนนี้
ซึ่งถ้าย้อนไปอ่านย่อหน้าแรก ข้อ 6 คือวิธีที่ร้านขายอยู่แล้วตั้งแต่ต้น 6 รอบ เพื่อวนกลับมาจุดเริ่ม 🙃
โค้ดฝั่งเชื่อม Wix ช่วงพีคมีถึง 3,562 บรรทัด (ส่วนใหญ่เป็นสำเนาทั้งแอปที่ generate ไว้แปะ) ตอนนี้เหลือโค้ดแค่ 160 บรรทัด (relay 38 + page code 51 + backend 71) กับ README อีก 67
━━━━━━━━━━
📝 สิ่งที่ได้เรียนรู้
ทดสอบบนเว็บจริง
"fake page is like you testing with your own answer" หน้าเทสต์ปลอมจะตอบตามสมมติฐานของเราเสมอ บั๊กใหญ่ใน Day 3 (cold start, ช่องว่างบนมือถือ, SKU ว่าง) โผล่บนหน้าจริงทั้งนั้นให้ร้านเป็นคนเลือกหนังสือ
ผมพยายามให้อัลกอริทึมเลือกเล่มเดียวที่ "ถูกต้อง" อยู่สองวัน คำตอบที่ดีที่สุดมาจากเจ้าของร้าน คือให้การสุ่มเป็นส่วนที่สนุก แล้วให้คนเลือกเล่มจริง ความเป็นร้านหนังสืออิสระก็ยังอยู่ตรงนั้นทำให้ถอยได้ง่าย สำคัญกว่าทำให้เป๊ะตั้งแต่แรก
ร้านค้าบน Railway เขียนดี เทสต์ผ่าน แต่ไม่ใช่สิ่งที่ธุรกิจต้องการ ที่โยนทิ้งได้ในคำสั่งเดียวเพราะยังไม่ push และไม่มีใครเริ่มใช้หาหลักฐานก่อนสั่งลองใหม่
ทุกครั้งที่ "ยังพังอยู่" ไปดูก่อนว่าหน้าจริงส่งอะไรออกไป จะเร็วกว่าเดาพูดสิ่งที่ตัวเองเข้าใจออกมาดัง ๆ
"ผมเข้าใจว่า 3 idea คือไอเดียที่สาม" ประโยคเดียวทำให้แก้ได้ใน 12 นาที ไม่ต้องเสียไปทั้งวันลบของเก่าทิ้งทันทีที่มีของใหม่มาแทน
มาร์ตินี่, prototype อีก 3 แบบ, ร้านบน Railway ไม่มีอะไรถูกซ่อนไว้ "เผื่อใช้" อยากได้คืนก็อยู่ใน git history
━━━━━━━━━━
🤝 ทำงานกับ AI จริง ๆ เป็นยังไง
ผมเป็นคนกำหนดทิศ AI ลงมือเขียนและเทสต์ การตัดสินใจเลี้ยวทุกครั้งเป็นของคน (ผมหรือเจ้าของร้าน) แต่ข้อมูลที่ทำให้ต้องเลี้ยว AI ขุดมาให้เยอะมาก
• โมเดล: 4 commits แรก (prototype, แก้ว, เชคเกอร์) ทำบน Fable 5.1 ตั้งแต่งานสีคืนวันที่ 3 เป็นต้นมา ทั้งหมดเป็น Opus 5.5
• ใช้ AI ตรวจงาน AI: reviewer ที่ถูกสั่งว่า "อย่าเชื่อรายงาน" จับบั๊กจริงได้หลายตัวก่อนขึ้นจริงใน 2 รอบแรก (แต่บั๊กใหญ่ใน Day 3 ก็ยังหลุดไปเจอบนหน้าจริงอยู่ดี)
• มันหยุดถามก่อนเสมอเมื่อเรื่องแตะเงินหรือของจริงในร้าน วันที่สองทั้งวันถามผมเป็นทางการแค่ 2 ครั้ง: เลือกทางจ่ายเงิน กับจะรวมไอเดียเจ้าของร้านยังไง
• มีราวกั้นจริง: มันสร้างสินค้าในร้านค้าจริงเองไม่ได้ เพราะ permission ของ Claude Code กันไว้ ส่วน push มันไม่ push เอง (กติกาที่ผมตั้งไว้)
• มันผิดได้ อย่าง "แถบมันห่าง" ที่อ่านเป็นรอนาน แต่หลายครั้งต้นเหตุคือผมเอง "3 idea" ผมพิมพ์กำกวมเอง มาร์ตินี่ก็ทำตามคำเจ้าของร้านเป๊ะ ๆ คนที่เปลี่ยนเป็นเชคเกอร์คือผม และผมเปลี่ยนใจบ่อยจนต้องขอโทษ มันตอบว่า "No need to apologise"
• บางทีผมก็เป็นแค่มือ ในที่ที่ AI กดเองไม่ได้ อย่าง Wix Editor ผมคือคนที่คลิกตาม screenshot
• สารภาพ: โพสต์นี้ก็ทำด้วย agent workflow ให้ไล่อ่าน git กับ log ทีละวันแล้วเช็กข้อเท็จจริงกับ commit อีกรอบ 🙃
━━━━━━━━━━
🔭 ต่อจากนี้
ยังมีสิ่งที่โค้ดแก้ไม่ได้
• ปุ่ม ••• ลอยของ Wix ที่บังแผงบนมือถือ (เจ้าของร้านต้องปิดเองในตั้งค่า)
• Cart API ที่ใช้อยู่ Wix จะถอดออกวันที่ 1 ก.พ. 2027
ตอนนี้ผมกำลังลองดู Wix Headless คือให้ Wix เป็น backend (สินค้า สต็อก ตะกร้า การจ่ายเงิน) แล้ว frontend เป็นโค้ดของเราเอง
ไอเดียที่น่าจะเริ่มก่อนคือทำ headless เฉพาะหน้า Book Bar เพื่อตัดชั้น iframe + relay ทิ้ง ส่วนทั้งเว็บยังให้เจ้าของร้านลากวางแก้เองได้เหมือนเดิม
เช้าวันถัดมาผมลองทำ proof of concept หน้าร้านแบบ headless ไว้ในอีกโปรเจกต์แล้ว แต่ยังเป็นการทดลอง ยังไม่ได้ตัดสินใจอะไร
━━━━━━━━━━
ถ้าชอบหนังสือ ชอบค็อกเทล หรือแค่อยากรู้ว่าวันนี้ตัวเองควรอ่านอะไร ลองไปเขย่าแก้วของตัวเองที่
👉 paperyard.co/bookbar
แล้วมาเล่าให้ฟังได้ว่าได้สูตรอะไร
(shake แรกบน production คือ AI เขย่าทดสอบตอน deploy แรก เมนูยังเป็นแบบเก่า ออกมาเป็น Fantasy · ชวนคิด · ปรัชญา + วิทยาศาสตร์/เทคโนโลยี · เร็ว วางไม่ลง · ทำลายจิตใจได้เลย 😇)
#booktail #PaperYard #ClaudeCode #buildinpublic #devไทย
