Wie aus dem Systemdiagramm ersichtlich ist, besteht Ori aus den Teilprogrammen \emph{ori}, \emph{orisync} und \emph{orifs}, die auf \emph{libori} aufgebaut sind.
\item[\emph{ori}] stellt die Schnittstelle zum Nutzer dar. Hier werden Repositorien erstellt, gelöscht und manuelle Operationen ausgeführt. Folgende Befehle sind implementiert:
\item[\emph{orisync}] entdeckt andere Kopien eines Repos und synchronisiert diese automatisch.
\begin{description}
\item[\emph{init}] startet die interaktive Konfiguration von \emph{orisync}, in der ein neues Cluster erstellt oder der genutzte Node einem bestehendem Cluster hinzugefügt werden kann.
\item[\emph{add [repo]}] fügt \emph{repo} zu den verwaltenden Repositorien hinzu.
\item[\emph{remove [repo]}] entfernt \emph{repo} aus der automatischen Synchronisation.
\item[\emph{list}] listet alle Repositorien auf, die \emph{orisync} verwaltet.
\item[\emph{hostadd [host]}] fügt einen statischen Host \emph{host} hinzu.
\item[\emph{hostremove [host]}] entfernt den Host \emph{host}.
\item[\emph{hosts}] listet alle eingetragenen Hosts auf.
\end{description}
\item[orifs] nutzt \emph{libFUSE}, um Repositorien als FUSE-Dateisysteme einzubinden.
\begin{description}
\item[\emph{[OPTIONS] mountpoint}] bindet ein Repo in \emph{mountpoint} ein. Das Verzeichnis \emph{mountpoint} muss vorhanden sein. \emph{OPTIONS} sind u.a.:
\begin{description}
\item[\emph{--repo=[REPO PATH]}] für abweichenden Pfad zum Repo \emph{REPO PATH}
\item[\emph{--shallow}] erzeugt Kopie mit Hintergrundtransfer
\item[\emph{--nocache}] erzeugt Kopie ohne Caching
\item[\emph{--journal-none}] deaktiviert das Wiederherstellungs-Journal
\item[\emph{--journal-async}] für asynchrones Wiederherstellungs-Journal
\item[\emph{--journal-sync}] für synchrones Wiederherstellungs-Journal
\end{description}
\end{description}
\item[\emph{libori}] verwaltet die Repositorien bestehend aus Index, Objekt-Speicher und Objekt-Metadaten. Die Repositorien werden lokal unter \emph{.ori} im Home-Verzeichnis gespeichert.