ResearchGo
Yakında yayındaCIBES Research Centre için, akademik bir makaleyi gönderimden yayına kadar götüren bir platform. Yapıldı, yayın öncesi son kontrollerinde.
- Rolüm
- Mimari ve geliştirme
- Yıl
- 2026
- Teknolojiler
- Next.js · Supabase (EU) · Python · FastAPI · GROBID · OpenAlex · Stripe
Diyagramın tamamını görmek için yana kaydırın.
Problem
Akademik gönderimler e-posta zincirleri ve Excel tablolarıyla yürüyor. Birden fazla kişi işin içine girdiği anda versiyonlar, hakem yorumları ve dergi şartları birbirinden kopuyor; editörler de her seferinde aynı soruları elle cevaplıyor: bu hangi versiyon, ne değişti, kaynaklar tutuyor mu, hangi dergi uygun?
Nasıl yapıldı
Tüm verileri AB içinde tutan, Supabase üzerinde bir Next.js uygulaması. Yazarlar ORCID ya da e-postayla giriş yapıp makalelerini PDF ya da Word olarak yüklüyor. Python bir worker (FastAPI) makaleyi gelir gelmez parse ediyor, PDF'leri GROBID üzerinden; yapılandırılmış metni de sahte ya da tekrar gönderilmiş işleri reddeden imzalı, zaman damgalı bir callback ile geri yolluyor. Başarılı her parse yeni bir versiyon oluyor ve şifreli saklanıyor, ama sadece metin gerçekten değiştiyse. Editörler herhangi iki versiyonu Word'deki gibi track changes ile karşılaştırıyor, metin içi atıfları kaynakçayla kontrol ediyor ve anlam benzerliğine göre sıralanmış dergi önerileri alıyor; embedding'ler kendi worker'ımızda hesaplanıyor, dergi verisi OpenAlex'ten geliyor. Ödemeler Stripe üzerinden.
Önemli kararlar
Bir kuralın yettiği yerde dil modeli yok
Track changes ve kaynak kontrolü deterministik kod, işin içinde hiç AI yok. Editörün bir diff'e güvenebilmesi gerekiyor ve bir kural her seferinde aynı cevabı verir.
Makaleler sunucularımızdan hiç çıkmıyor
Dergi eşleştirme, makalenin embedding'ini kendi worker'ımızda çıkarıyor; yani hiçbir makale metni üçüncü bir tarafa gitmiyor. Sıralama tamamen benzerliğe dayanıyor. İndeks, açık erişim ve ücret bilgileri etiket olarak gösteriliyor ve sırayı hiç değiştirmiyor.
Her iş imzalı
Web uygulaması ile worker arasındaki işler bir HMAC imzası ve bir zaman damgası taşıyor. Sahte ya da tekrar gönderilmiş bir iş reddediliyor; işin ortasında çöken bir worker da makalenin yerini kaybetmiyor.
Repodan kod
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. satır. Değişen bir paragrafın içinde diff kelime kelime çalışıyor ve boşlukları koruyor; böylece Word'deki track changes gibi okunuyor.
12. satır. İlk geçiş: paragrafların tamamı üzerinde bir longest-common-subsequence diff'i neyin kaldığını, neyin eklendiğini ve neyin silindiğini buluyor.
23. satır. Hemen ardından bir ekleme gelen bir silme, iki ayrı değişiklik değil, düzenlenmiş tek bir paragraf.
Şu an ne durumda
Yapıldı ve son kontrollerinde. Kontroller biter bitmez yayına çıkıyor.