The data layer (GitHub Repo. Directory) in this simple todo app; relies on MobX, and it is all Vanilla JS (except for the MobX part, that is).
The React views (read: components, for instance TodoApp.js) depend on the @observer decorator, to cause a re-render whenever there is a change in the data layer.
If you were using Vanilla JS, you would wrap a "render" function — which would update your DOM, the Vanilla JS way, whenever there's a change in the data layer — with MobX's autorun function (docs).