ResearchGo
Startet baldEine Plattform für das CIBES Research Centre, die einen Fachartikel von der Einreichung bis zur Veröffentlichung begleitet. Fertig gebaut und in den letzten Checks vor dem Launch.
- Meine Rolle
- Architektur und Entwicklung
- Jahr
- 2026
- Gebaut mit
- Next.js · Supabase (EU) · Python · FastAPI · GROBID · OpenAlex · Stripe
Scroll seitlich, um das ganze Diagramm zu sehen.
Das Problem
Wissenschaftliche Einreichungen laufen über E-Mail-Verläufe und Tabellen. Versionen, Gutachterkommentare und Vorgaben der Zeitschriften driften auseinander, sobald mehr als eine Person beteiligt ist, und Herausgeber beantworten jedes Mal dieselben Fragen von Hand: Welche Version ist das, was hat sich geändert, stimmen die Literaturangaben, welche Zeitschrift passt?
Wie es gebaut ist
Eine Next.js-App auf Supabase, bei der alle Daten in der EU bleiben. Autoren melden sich mit ORCID oder per E-Mail an und laden ein Manuskript als PDF oder Word-Datei hoch. Ein Python-Worker (FastAPI) parst es beim Eingang, PDFs über GROBID, und schickt den strukturierten Text über einen signierten Callback mit Zeitstempel zurück, der gefälschte oder wiederholt gesendete Jobs ablehnt. Jedes erfolgreiche Parsing wird zu einer neuen Version, die verschlüsselt gespeichert wird, aber nur, wenn sich der Text tatsächlich geändert hat. Herausgeber vergleichen zwei beliebige Versionen mit Änderungsverfolgung wie in Word, prüfen Zitate im Text gegen das Literaturverzeichnis und bekommen semantisch sortierte Vorschläge für Zeitschriften, auf Basis von Embeddings, die auf unserem eigenen Worker berechnet werden, und Zeitschriftendaten von OpenAlex. Zahlungen laufen über Stripe.
Entscheidungen, auf die es ankam
Kein Sprachmodell, wo eine Regel reicht
Die Änderungsverfolgung und die Prüfung der Literaturangaben sind deterministischer Code, ohne KI. Ein Herausgeber muss einem Diff vertrauen können, und eine Regel gibt jedes Mal dieselbe Antwort.
Manuskripte verlassen nie unsere Server
Das Zeitschriften-Matching berechnet die Embeddings des Artikels auf unserem eigenen Worker, also geht kein Manuskripttext an Dritte. Das Ranking beruht allein auf Ähnlichkeit. Angaben zu Indexierung, Open Access und Gebühren erscheinen als Labels und ändern die Reihenfolge nie.
Jeder Job ist signiert
Jobs zwischen der Web-App und dem Worker tragen eine HMAC-Signatur und einen Zeitstempel. Ein gefälschter oder wiederholt gesendeter Job wird abgelehnt, und stürzt ein Worker mitten im Job ab, behält das Manuskript seinen Platz.
Code aus dem Repo
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 };
}
Zeile 2. Innerhalb eines geänderten Absatzes läuft der Diff Wort für Wort und behält die Leerzeichen bei, so liest er sich wie die Änderungsverfolgung in Word.
Zeile 12. Erster Durchlauf: Ein Diff über ganze Absätze auf Basis der längsten gemeinsamen Teilfolge findet, was geblieben ist, was hinzugekommen ist und was entfernt wurde.
Zeile 23. Eine Löschung, auf die direkt eine Einfügung folgt, ist ein bearbeiteter Absatz, nicht zwei getrennte Änderungen.
Wo es heute steht
Fertig gebaut und in den letzten Checks. Die Plattform geht an den Start, sobald sie erledigt sind.