A clean RN/native layout: A local SQLite database (chunks + sqlite-vec vectors + app state) An embedding module (ONNX/Core ML) A retriever (embed query → KNN → return chunks with citation metadata) A generation client (calls the chosen LLM with retrieved context) Study/answer UIs on top Keep a hard "outbound guard" in the generation client that asserts only {query + retrieved chunk text} ever leaves, plus an audit log of every call. This is both good engineering and a strong privacy talking point.