अपना प्रोडक्ट · Carrom
असली कैरम, हमारी खुद लिखी फ़िज़िक्स के साथ।
Carrom फ़ोन-फ़र्स्ट बोर्ड गेम है, लकड़ी के बोर्ड और सटीक गोटी-फ़िज़िक्स के साथ। इसमें पाँच तरह के खेल हैं, जिनमें बांग्लादेश, भारत और पाकिस्तान में खेले जाने वाले 29 Game और Tal Gach भी हैं, साथ में ऑनलाइन 1 v 1 और 2 v 2, बॉट और पास-एंड-प्ले। एक TypeScript कोडबेस वेब, Android और iOS पर चलता है, और ऑनलाइन खेल हमारे अपने रियलटाइम सर्वर पर।
कैसे खेलें अपने AI असिस्टेंट के साथ इस्तेमाल करें
वेब, App Store (iPhone और iPad) और Google Play (Android) पर लाइव।

- Web (PWA)
- Android
- iOS
- iPadOS
- खेल के प्रकार, हर एक का अपना नियम इंजन
- 5
- स्ट्रोक, ब्राउज़र इंजनों में बिट-दर-बिट एक जैसे
- 4,320
- स्वचालित टेस्ट: 396 यूनिट और 150 ब्राउज़र टेस्ट, हर ब्राउज़र टेस्ट तीन स्क्रीन आकारों पर चलाया गया
- 540+
- थ्रॉटल्ड Fast 3G पर पहला लोड
- ≤ 3 s
ऐप के भीतर
चल रहे ऐप की असली स्क्रीन, जैसी वे स्टोर लिस्टिंग में दिखती हैं।

Tal Gach की मीनार तोड़ें 
गुलेल की तरह निशाना 
एनिमेटेड बोर्ड 
ऑनलाइन 2 v 2 
बोर्ड, स्ट्राइकर और गोटी सेट 
रोज़ की चुनौती 
पाँच खेल, एक टैप में
खिलाड़ियों को क्या मिलता है
पाँच तरह के खेल
Classic, 29 Game (पहले 29 तक), Tal Gach (19 गोटियों की मीनार तोड़ें, पहले 170 तक), Disc Pool और Freestyle, साथ में रोज़ की चुनौती और ट्यूटोरियल।
ऑनलाइन 1 v 1 और 2 v 2
रेटिंग के हिसाब से Quick Match, खाली सीटें भरते बॉट, निजी रूम, ऐप खोलने वाले चैलेंज लिंक, खुले रूम का लॉबी, रीमैच, इमोट, 20 सेकंड की टर्न घड़ी और हर खेल प्रकार की अलग Elo रेटिंग।
बॉट और पास-एंड-प्ले
4 कठिनाइयों (Easy से Expert) और 4 स्वभावों (संतुलित, आक्रामक, रक्षात्मक, ट्रिक-शॉट) वाले बॉट, हर एक के अपने नाम और झंडे के साथ, और एक डिवाइस पर 2 या 4 खिलाड़ियों के लिए पास-एंड-प्ले।
प्रगति जो आपके साथ चलती है
सिक्के, एनिमेटेड बोर्ड, स्ट्राइकर और गोटी सेट की शॉप, उपलब्धियाँ, आँकड़े और रोज़ का सिलसिला। इसे हर डिवाइस पर रखने के लिए Google या Apple से साइन इन करें।
ऑपरेटर टूल
हमारा एडमिन पैनल लाइव खेल और खिलाड़ी दिखाता है, मॉडरेशन संभालता है, किसी भी खिलाड़ी के सिक्के संदेश के साथ बदलता है, और ऐप रिलीज़ के बिना विज्ञापन, अनिवार्य अपडेट, रिव्यू प्रॉम्प्ट, मैचमेकिंग स्विच और यहाँ तक कि स्टाइलिंग भी बदलता है।
एक कोडबेस, हर जगह
वेब, Android, iPhone और iPad एक ही कोडबेस से, और वेब ऐप के रूप में इंस्टॉल योग्य। रूम लिंक ऐप इंस्टॉल हो तो ऐप खोलते हैं, नहीं तो वेब गेम।
शुरू से बनाया
हर परत हमारी अपनी है, खेल के नियमों से लेकर उस सर्वर तक जिस पर वह चलता है।
गेम क्लाइंट
सख़्त TypeScript, Vite और Canvas 2D, बिना किसी गेम इंजन और UI फ़्रेमवर्क के। घूमते बोर्ड और Tal Gach मीनार के प्रीव्यू शुद्ध CSS 3D हैं।
- TypeScript
- Vite
- Canvas 2D
- CSS 3D
हमारी अपनी फ़िज़िक्स
1/120 s के तय कदम पर इवेंट-ड्रिवन गोटी-फ़िज़िक्स, फ़्रेम रेट से स्वतंत्र: पॉकेट के जबड़े, ऐसी गोटी जो तभी गिरती है जब उसका पर्याप्त हिस्सा छेद के ऊपर हो, खड़खड़ाकर बाहर आना और टूटती मीनार। इसने एक सामान्य-उपयोग फ़िज़िक्स लाइब्रेरी की जगह ली।
- Deterministic
- Seeded randomness
- Headless tests
रियलटाइम बैकएंड
MongoDB पर हमारा अपना Node सर्वर, जो एक छोटा JSON-over-WebSocket प्रोटोकॉल बोलता है: get, set, compare-and-set, watch और presence। यह वही सुरक्षा-नियम फ़ाइल जाँचता है जो Firebase Realtime Database जाँचता।
- Node.js
- MongoDB
- WebSocket
- esbuild
ऐप और साइन-इन
Android और iOS के लिए Capacitor ऐप। Google और Apple साइन-इन Firebase Auth से चलता है, और हमारा सर्वर हर टोकन खुद जाँचता है। विज्ञापन AdMob से आते हैं, असली पैसे से कोई खरीदारी नहीं।
- Capacitor
- Firebase Auth
- AdMob
- App Links
संचालन
सर्वर हम खुद चलाते हैं
बीच में कोई गेम-बैकएंड सेवा नहीं: हमारा अपना सर्वर, अपने डिप्लॉय, अपनी मॉनिटरिंग।
- हमारा अपना Linux सर्वर: nginx Cloudflare के पीछे Let’s Encrypt TLS के साथ खेल परोसता है
- WebSocket, ऐप कॉन्फ़िग और हेल्थ चेक systemd के तहत Node सर्विस को प्रॉक्सी होते हैं
- एडमिन पैनल अपनी अलग सर्विस के रूप में चलता है और एक ऑपरेटर API को बुलाता है जो केवल उसी मशीन पर जवाब देती है
- एक कमांड में डिप्लॉय: बिल्ड, टाइमस्टैम्प वाली रिलीज़ अपलोड, स्विच, रीस्टार्ट, हेल्थ-चेक; तुरंत रोलबैक के लिए आख़िरी 5 रिलीज़ सुरक्षित
- Cloudflare के ज़रिए बांग्लादेश से लगभग 210 ms माध्यिका राउंड ट्रिप (लॉन्च पर नापा गया)
- Google Play और App Store Connect के लिए स्क्रिप्ट से बने ऐप बिल्ड
- रूम इनवाइट के लिए Android App Links और iOS यूनिवर्सल लिंक
कठिन समस्याएँ जो हमने सुलझाईं
वे हिस्से जो खिलाड़ी कभी नहीं देखते, हमारी नापी संख्याओं के साथ।
हर फ़ोन पर एक जैसी फ़िज़िक्स
- समस्या
- ऑनलाइन खेल में हर फ़ोन प्रतिद्वंद्वी की स्ट्रोक खुद सिमुलेट करता है। अगर दो डिवाइस कभी एक संख्या अलग निकालें, तो उनके बोर्ड अलग हो जाएँगे, इसलिए फ़िज़िक्स हर जगह सटीक होनी थी।
- हमने क्या किया
- सिमुलेशन केवल वही ऑपरेशन इस्तेमाल करता है जो हर JavaScript इंजन पर सटीक हैं, हमारे अपने वर्गमूल-आधारित hypot, log, acos, sin और cos के साथ। सारी यादृच्छिकता सीड से तय है और कोर कभी घड़ी नहीं पढ़ता।
नतीजा Chromium और WebKit के इंजनों में 4,320 स्ट्रोक जाँचे गए: हर बोर्ड बिट-दर-बिट एक जैसा।
एक डीसिंक, जो पकड़ा और रोका गया
- समस्या
- अलग-अलग ऐप संस्करणों वाले, थोड़ी अलग फ़िज़िक्स के साथ, खिलाड़ी आपस में जोड़ दिए जा रहे थे, और उनके बोर्ड मेल नहीं खा रहे थे।
- हमने क्या किया
- अब एक प्रोटोकॉल संस्करण मैचमेकिंग और रूम पर पहरा देता है, और फ़िज़िक्स फ़िंगरप्रिंट टेस्ट बिल्ड फ़ेल कर देता है अगर संस्करण बढ़ाए बिना फ़िज़िक्स बदली जाए।
नतीजा केवल एक जैसी फ़िज़िक्स वाले खिलाड़ी ही एक बोर्ड साझा करते हैं।
निष्पक्ष ढंग से टूटने वाली मीनार
- समस्या
- Tal Gach में पहला शॉट 19 गोटियों की रखी हुई मीनार पर लगता है। यह असली जैसा लगना चाहिए और दोनों खिलाड़ियों के लिए निष्पक्ष भी।
- हमने क्या किया
- 70% गति या उससे ज़्यादा की चोट नीचे की एक-दो गोटियाँ निकाल देती है और मीनार खड़ी रहती है; हल्की चोटें उसे गिरा देती हैं। यादृच्छिकता सीड से तय है, इसलिए हर डिवाइस पर एक जैसा टूटना दिखता है।
नतीजा ज़ोरदार चोटें 90% बार नीचे की गोटियाँ निकाल देती हैं, हर स्क्रीन पर एक जैसा।
Mac पर आवाज़
- समस्या
- Apple-silicon Mac पर चलने वाला iPad ऐप न AAC और न Opus ऑडियो डिकोड कर पाता था।
- हमने क्या किया
- ऐप आवाज़ों और संगीत की 16-बिट WAV कॉपी साथ भेजता है, और खेल उन्हें खुद डिकोड करता है।
नतीजा हर डिवाइस पर, Mac समेत, एक जैसी आवाज़।
खेल को छुए बिना एक वेंडर से छुटकारा
- समस्या
- ऑनलाइन खेल Firebase Realtime Database पर शुरू हुआ था, और हम खेल दोबारा लिखे बिना डेटा अपने सर्वर पर चाहते थे।
- हमने क्या किया
- हर ऑनलाइन फ़ीचर एक ही डेटाबेस इंटरफ़ेस से बात करता है। हमारा सर्वर वही नियम फ़ाइल उन्हीं अर्थों के साथ लागू करता है, और पूरे मैचों तथा 180 से ज़्यादा अनुमत या अस्वीकृत लेखनों का एक जाँच सूट दोनों बैकएंड पर चलता है।
नतीजा खेल का डेटा अब हमारे अपने सर्वर पर है, और बैकएंड बदलना दो सेटिंग का बिल्ड स्विच है।
पहले शॉट तक तेज़
- समस्या
- कैज़ुअल गेम के पास खिलाड़ी का मन जीतने के लिए सेकंड ही होते हैं, अक्सर धीमे मोबाइल कनेक्शन पर।
- हमने क्या किया
- डाउनलोड करने के लिए कोई इंजन या फ़्रेमवर्क नहीं, पहले टैप से पहले कोई ऑडियो नहीं, और एक परफ़ॉर्मेंस टेस्ट जो प्रोडक्शन बिल्ड को थ्रॉटल्ड कनेक्शन पर चलाता है।
नतीजा थ्रॉटल्ड Fast 3G पर पहला लोड 3 s या उससे कम में।
प्रोडक्ट की तरह परखा, डेमो की तरह नहीं
- 396 यूनिट टेस्ट और 150 ब्राउज़र टेस्ट, हर एक फ़ोन, टैबलेट और डेस्कटॉप आकार पर स्क्रीनशॉट बेसलाइन के साथ चलाया गया (400 से ज़्यादा रन)
- बॉट-बनाम-बॉट संतुलन रन और मंकी टेस्ट
- एक एमुलेटर सूट जो डेटाबेस नियमों के विरुद्ध पूरे ऑनलाइन मैच खेलता है
- डिटर्मिनिस्टिक फ़िज़िक्स की बदौलत यूनिट टेस्ट में हेडलेस सिमुलेट किए स्ट्रोक
तकनीक
- TypeScript
- Vite
- Canvas 2D
- Node.js
- MongoDB
- WebSocket
- Capacitor
- Firebase Auth
- AdMob
- Vitest
- Playwright
- nginx
- Cloudflare
- systemd
क्या आप चाहते हैं कि गेम या रियलटाइम ऐप ऐसे बने?
हम गेम और रियलटाइम प्लेटफ़ॉर्म शुरू से अंत तक डिज़ाइन करते, बनाते और चलाते हैं: ऐप, सर्वर, स्टोर और संचालन।