A pure pipe will only trigger change detection when one of its input values changes (e.g. you receive data from a backend endpoint (in a component) and the component’s view is updated thereby passing a new value to the pipe.
An impure pipe will run on every change detection cycle (click, scroll, etc). They are not great performance-wise but sometimes necessary.
I use an impure pipe to display error messaging since mutation of the error object on the form control class does not trigger change detection (the object reference stays the same even if the value of one of its keys changes).