ResearchGo
जल्द लॉन्चCIBES Research Centre के लिए एक प्लेटफ़ॉर्म, जो एक एकेडमिक पेपर को सबमिशन से पब्लिकेशन तक ले जाता है। बनकर तैयार है और लॉन्च से पहले की आख़िरी जाँच में है।
- मेरी भूमिका
- आर्किटेक्चर और डेवलपमेंट
- साल
- 2026
- टेक्नोलॉजी
- Next.js · Supabase (EU) · Python · FastAPI · GROBID · OpenAlex · Stripe
पूरा डायग्राम देखने के लिए साइड में स्क्रॉल करें।
समस्या
एकेडमिक सबमिशन ईमेल थ्रेड और स्प्रेडशीट पर चलते हैं। जैसे ही एक से ज़्यादा लोग शामिल होते हैं, वर्ज़न, रिव्यूअर के कमेंट और जर्नल की ज़रूरतें बिखरने लगती हैं, और एडिटर हर बार उन्हीं सवालों का जवाब हाथ से देते हैं: यह कौन सा वर्ज़न है, क्या बदला, क्या रेफ़रेंस सही बैठते हैं, कौन सा जर्नल फ़िट होगा?
यह कैसे बना है
Supabase पर एक Next.js ऐप, जिसका सारा डेटा यूरोपीय संघ में रहता है। लेखक ORCID या ईमेल से साइन इन करते हैं और मैनुस्क्रिप्ट PDF या Word में अपलोड करते हैं। एक Python worker (FastAPI) उसके आते ही उसे parse करता है, PDF को GROBID से, और structured टेक्स्ट को एक signed और timestamped callback से वापस भेजता है, जो नकली या दोबारा भेजे गए jobs को रिजेक्ट कर देता है। हर सफल parse एक नया वर्ज़न बनता है, जो एन्क्रिप्ट होकर स्टोर होता है, लेकिन सिर्फ़ तब जब टेक्स्ट सच में बदला हो। एडिटर किन्हीं भी दो वर्ज़न की तुलना Word जैसे track changes से करते हैं, टेक्स्ट के अंदर के citations को रेफ़रेंस लिस्ट से मिलाते हैं, और अर्थ के आधार पर रैंक किए गए जर्नल सुझाव पाते हैं, जिनके लिए embeddings हमारे अपने worker पर बनते हैं और जर्नल डेटा OpenAlex से आता है। पेमेंट Stripe पर चलते हैं।
अहम फ़ैसले
जहाँ नियम से काम चल जाए, वहाँ लैंग्वेज मॉडल नहीं
Track changes और रेफ़रेंस चेक deterministic कोड हैं, इनमें कोई AI नहीं। एडिटर को diff पर भरोसा करना पड़ता है, और नियम हर बार एक ही जवाब देता है।
मैनुस्क्रिप्ट कभी हमारे सर्वर से बाहर नहीं जाते
जर्नल मैचिंग के लिए पेपर का embedding हमारे अपने worker पर बनता है, इसलिए मैनुस्क्रिप्ट का कोई भी टेक्स्ट किसी थर्ड पार्टी के पास नहीं जाता। रैंकिंग सिर्फ़ similarity पर होती है। इंडेक्स, ओपन-एक्सेस और फ़ीस की जानकारी लेबल के रूप में दिखती है और क्रम कभी नहीं बदलती।
हर job साइन होता है
वेब ऐप और worker के बीच जाने वाले हर job में HMAC signature और timestamp होता है। नकली या दोबारा भेजा गया job रिजेक्ट हो जाता है, और अगर कोई worker job के बीच में बंद हो जाए, तो मैनुस्क्रिप्ट अपनी जगह नहीं खोता।
रिपो से कोड
function diffParagraphPair(before: string, after: string): DiffSegment[] {
return diffWordsWithSpace(before, after).map((part) => ({1
op: part.added ? "ins" : part.removed ? "del" : "equal",
text: part.value,
}));
}
export function diffManuscripts(before: string, after: string): DiffResult {
const a = splitParagraphs(before);
const b = splitParagraphs(after);
// …
const parts = diffArrays(a, b);2
let i = 0;
while (i < parts.length) {
const part = parts[i];
if (!part) break;
if (!part.added && !part.removed) {
// …
i++;
continue;
}
const next = parts[i + 1];
const paired = Boolean(part.removed && next?.added);3
const removedList = part.removed ? part.value : [];
const addedList = part.added ? part.value : paired && next ? next.value : [];
const pairs = Math.min(removedList.length, addedList.length);
for (let k = 0; k < pairs; k++) {
const segments = diffParagraphPair(removedList[k] as string, addedList[k] as string);
paragraphs.push({ kind: "changed", segments });
// …
}
// …
i += paired ? 2 : 1;
}
return { paragraphs, summary };
}
लाइन 2. बदले हुए पैराग्राफ़ के अंदर diff शब्द-दर-शब्द चलता है और स्पेसिंग बनाए रखता है, इसलिए यह Word के track changes जैसा पढ़ा जाता है।
लाइन 12. पहला पास: पूरे पैराग्राफ़ों पर longest-common-subsequence diff पता लगाता है कि क्या वैसा ही रहा, क्या जोड़ा गया और क्या हटाया गया।
लाइन 23. हटाने के ठीक बाद जोड़ना एक ही एडिट किया गया पैराग्राफ़ है, दो अलग बदलाव नहीं।
अभी कहाँ तक पहुँचा
बनकर तैयार है और आख़िरी जाँच में है। जाँच पूरी होते ही लॉन्च होगा।