Tüm yazılar

ResearchGo

Yakında yayında

CIBES 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
AUTHOR: PDF OR WORDNEXT.JS + SUPABASEPYTHON WORKER: FASTAPI + GROBIDVERSIONS: ENCRYPTEDTRACK CHANGES, REFERENCE CHECKJOURNAL MATCH: OPENALEXSIGN INSIGNED JOBPARSED TEXTCOMPAREEMBEDDINGALL DATA IN THE EURULES ONLY, NO LANGUAGE MODELTEXT STAYS ON OUR WORKER

Diyagramın tamamını görmek için yana kaydırın.

MimariUPLOAD → PARSE ON ARRIVAL → ENCRYPTED VERSIONS → EDITOR TOOLS

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

apps/web/lib/versions/diff.tsİki makale versiyonu arasında, dil modeli olmadan track changes
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 };
}
  1. 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.

  2. 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.

  3. 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.

Sonraki yazıÜrünereklam